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

3

我一直在尝试了解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
  1. 你的Cython代码不会生成numpy.sum的代码 - 它只是调用现有的函数。
  2. 调用cython -a filename将给您带注释的HTML,显示Cython代码转换为什么C代码。
- DavidW
1个回答

2
您可以运行cython -a test.pyx,它将打开您的默认Web浏览器,并生成一个HTML,其中每个Cython代码行都带有为其生成的C代码的注释。主要目的是通过消除不必要的Python调用来优化代码,因此它会突出显示涉及与Python运行时的大量交互的行。作为Cython新手,我无法过分强调它的有用性。请注意,根据上述“主要目的”,它不包括直接对应于源行的部分之外的样板代码。使用生成页面上的原始C链接查看它。例如,__pyx_n_s_numpy是一个包含字符串“numpy”的PyObject。正如您可以通过搜索找到的那样,Cython在初始化时为所有需要传递给Python运行时的字符串常量创建这些对象。__Pyx_Import()也是一个自动生成的函数,它包装了内置的__import__。幸运的是(感谢Cython的作者),自动生成的名称非常描述性,因此您很少需要实际查找它们:在大多数情况下,您可以猜测实体是/做什么。所有Cython自动生成的实体都有一个有用的前缀以区分它们,例如来自Python C API的实体。

谢谢您的建议,请看看我的更新 :) - Sulabh Tiwari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接