簡體   English   中英

Cython:數學表達式錯誤(在 Python 中工作正常)

[英]Cython: Error in math expression (works fine in Python)

我正在嘗試對我的 Python 代碼進行 cythonize 以提高性能。

我沒有對我的原始 python 代碼進行任何更改,我只是運行setup.py並獲取 .c 文件。

現在我遇到了這個問題:當我在 Python 中執行基本的數學運算時,它工作正常,而在 Cython 中卻沒有按預期工作。

代碼片段如下,這里我嘗試計算給定x在圓心 [3,0] 和半徑 1 的圓上的y坐標:

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是空的(實際上代碼甚至沒有打印任何東西,我從另一個 function 那里得到這個我打印 y)

我在語法上做錯了嗎?

提前致謝。


編輯:

這是我的setup.py

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

我運行 cython 版本: import my_code

output 是空的。


編輯 2:感謝 joni,我更改了原始代碼中的除法,現在它可以工作了!

我懷疑在setup.py中啟用了cdivision=True 在 C 中,兩個 integer 文字的除法會去掉所有小數位。 因此,您的 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文件僅包含 function 和 class 定義。 您必須從 Python 調用您的 cythonized 模塊的函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM