识别使用Cython生成的C代码中的C函数

时间:2016-11-24 10:56:58

标签: python c python-2.7 cython

我一直试图了解cython是如何运作的。首先,我写了包含

test.pyx 文件
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 sum 函数,我可以将其用作其他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 个答案:

答案 0 :(得分:2)

You can run cython -a test.pyx,它将打开您的默认Web浏览器,其中包含生成的HTML,其中每个Cython代码行都使用为其生成的C代码进行注释。

这样做的主要目的是帮助您通过消除不必要的Python调用来优化代码,因此它突出了涉及与Python运行时进行大量交互的行。

作为一名Cython新手,我不能夸大其帮助。

请注意按照&#34;主要目的&#34;上面,它不包括与源代码行直接对应的部分之外的样板代码。使用生成页面上原始C的链接来查看。

  • E.g。 __pyx_n_s_numpyPyObject,其中包含"numpy"字符串。正如您通过搜索所看到的,Cython在初始化时为需要传递给Python运行时的所有字符串常量创建这些。 __Pyx_Import()也是一个自动生成的函数,用于包装内置__import__

幸运的是(感谢Cython的作者),自动生成的名称非常具有描述性,因此您很少需要实际查找它们:在大多数情况下,您可以猜测实体是什么/做了什么。并且所有Cython自动生成的实体都有助于将它们与例如它们区分开来。来自Python C API的那些。