我一直在努力了解 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 格式。
最佳答案
You can run cython -a test.pyx
,它将打开您的默认网络浏览器,其中包含生成的 HTML,每个 Cython 代码行都用为其生成的 C 代码进行注释。
这样做的主要目的是通过消除不必要的 Python 调用来帮助您优化代码,因此它突出显示涉及与 Python 运行时进行大量交互的行。
作为我自己的 Cython 新手,我无法夸大它的帮助。
请注意根据上面的“主要目的”,它不包括样板代码直接对应于源行的部分之外。使用生成页面上指向原始 C 的链接可以看到这一点。
- 例如
__pyx_n_s_numpy
是一个包含"numpy"
字符串的PyObject
。正如您通过搜索看到的那样,Cython 在初始化时为需要传递给 Python 运行时的所有字符串常量创建了这些。__Pyx_Import()
也是一个自动生成的函数,它包装了内置的__import__
.
幸运的是(=感谢 Cython 的作者),自动生成的名称非常具有描述性,因此您很少需要实际查找它们:在大多数情况下,您可以猜出实体是什么/做什么。并且所有 Cython 自动生成的实体都带有有用的前缀,以将它们与例如实体区分开来。来自 Python C API 的。
关于python - 识别使用 Cython 生成的 C 代码中的 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40784597/