Cython:数学表达式错误(在 Python 中工作正常)

Cython: Error in math expression (works fine in Python)

我正在尝试对我的 Python 代码进行 cythonize 以提高性能。

我没有对原始 python 代码进行任何更改,我只是 运行 setup.py 并获取 .c 文件。

现在我遇到了这个问题:当我在 Python 中执行基本数学运算时,它工作正常,而在 Cython 中它没有按预期工作。

代码片段如下,这里我尝试计算给定的x在圆心上的y坐标[3,0] 和半径 1:

import math
import numpy as np

def calculateY(x, center, radius):
    a = -2*center[0]
    b = -2*center[1]
    c = center[0]**2 + center[1]**2 - radius**2
    tmp = (b)**2 - 4*(c) - 4*(a)*x - 4*(x**2)
    return 1/2*(-b + math.sqrt(tmp))       ###### I only want the y>0

C1, R1 = [3,0], 1

Pstart = np.array([2.13766028, 0.50633014])

print(calculateY(Pstart[0], C1, R1))

如果我在Python中运行这个,我得到y = 0.5063301366799338这是正确的结果。 如果我对代码进行 cythonize,然后 运行 它被 import my_code,我得到 y = 0.0 告诉我 y 是空的(实际上代码甚至没有打印任何东西,我从另一个打印 y)

的函数得到了这个

我是不是语法有问题?

提前致谢。


编辑:

这是我的 setup.py:

import distutils.core
import Cython.Build
distutils.core.setup(
    ext_modules = Cython.Build.cythonize("my_code.pyx"))

我 运行 cython 版本有: import my_code

输出为空。


编辑 2: 感谢 joni,我更改了原始代码中的除法,现在可以使用了!

我怀疑 cdivision=True 在您的 setup.py 中启用了。在 C 语言中,两个整数文字的除法会切断所有小数位。因此,return 语句中的 1/2 等于 0.0。相反,只需使用浮点文字,即

# my_code.pyx
def calculateY(x, center, radius):
    a = -2*center[0]
    b = -2*center[1]
    c = center[0]**2 + center[1]**2 - radius**2
    tmp = (b)**2 - 4*(c) - 4*(a)*x - 4*(x**2)
    return 1.0/2.0*(-b + math.sqrt(tmp))           # <--- Note the 1.0/2.0

然后,通过python3 setup.py install安装Cython模块后,您可以从Python:

使用它
# mwe.py
from my_code import calculateY
import numpy as np

C1, R1 = [3,0], 1
Pstart = np.array([2.13766028, 0.50633014])
print(calculateY(Pstart[0], C1, R1))           # Output: 0.5063301366799338

请注意,Cython .pyx 文件仅包含函数和 class 定义。您必须从 Python.

调用 cythonized 模块的函数