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 模块的函数
我正在尝试对我的 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.