2016-11-24 50 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查看更新 –