2016-11-24 341 views
1

我一直在試圖理解cython是如何工作的。第一個,我已經寫了包含test.pyx文件,在使用Cython生成的C代碼中識別C函數

import numpy as np 
a=2;b=3; 
np.sum(a,b) 
np.subtract(a,b) 

setup.py文件包這段代碼,

from distutils.core import setup 
from Cython.Build import cythonize 

setup(ext_modules = cythonize("test.pyx")) 

後來我運行命令行test.pyx爲,

python setup.py build_ext --inplace 

該命令生成test.c代碼。生成的C代碼真的很大,很難理解。現在,我只想知道在哪裏可以找到np.sum(a,b)的實現。如果我成功獲得Python到C的翻譯總和函數可以將它用作其他C代碼中的獨立函數。這個函數有一些依賴關係,我不得不隨它一起復制。

期待好的答案。

謝謝你們的建議。看看html文件後我看到的樣子,

+06: import numpy as np 
__pyx_t_1 = __Pyx_Import(__pyx_n_s_numpy, 0, -1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 6, __pyx_L1_error) 
__Pyx_GOTREF(__pyx_t_1); 
if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) __PYX_ERR(0, 6, __pyx_L1_error) 
__Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; 

這意味着它調用__pyx_n_s_numpy模塊。 C編譯器如何運行此模塊。我認爲這個模塊的實現是.py格式。

+1

1)您的Cython代碼不會生成'numpy.sum'的代碼 - 它只是調用現有的函數。 2)調用'cython -a filename'會給你帶註釋的html,顯示Cython代碼轉換爲什麼c代碼。 – DavidW

回答

2

You can run cython -a test.pyx,它將使用生成的HTML打開默認Web瀏覽器,每個Cython代碼行都使用爲其生成的C代碼註釋。

這樣做的主要目的是通過消除不必要的Python調用來幫助您優化代碼,因此它突出顯示了與Python運行時有很多交互的行。

作爲一個Cython新手我自己,我不能誇大它的幫助。

注意按照「主要目的」上方,它不包括直接對應於源極線的部分的外部樣板代碼。使用鏈接到生成的頁面上的原始C來查看。

  • 例如, __pyx_n_s_numpy是一個PyObject持有"numpy"字符串。正如您通過搜索所看到的,Cython在初始化時爲所有需要傳遞給Python運行時的字符串常量創建這些常量。 __Pyx_Import()也是自動生成的函數,它包裝內置的__import__

幸運(=感謝用Cython的作者),自動生成的名稱已經說明了,所以你很少需要實際看看他們:在大多數情況下,你可以猜測的實體是什麼/做。所有的Cython自動生成的實體都有助於加上前綴以區別於它們。來自Python C API的。

+0

謝謝你的建議,請看看我的更新:) –

+1

@SulabhTiwari查看更新 –