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

标签 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 格式。

最佳答案

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/

相关文章:

C 文件检查文件是否为空或包含 ASCII 文本

java - 是否可以让一个SIM卡和一个收发器自动向另一个SIM卡(带有收发器)发送短信?

django - 如何在 django 中为每个用户创建单独的文件夹并让用户在该文件夹中上传文件?

python - 安全转换为元组/列表

python - 如何使用 youtube data api 检查 Creativecommons 视频?我有以下代码,如果视频是知识共享,如何打印 true?

python - 使用 PyGame 设计冒险游戏的正确方法是什么?

python - 键合并的两个字典的值并集

python-2.7: 在类的 setter 方法中忽略了 doctests

c - Winsock 回显服务器端口

Python 字符串正则表达式