【问题标题】:Identify C function in C code generated using Cython识别使用 Cython 生成的 C 代码中的 C 函数
【发布时间】:2017-04-08 15:37:33
【问题描述】:

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

标签: python c python-2.7 cython


【解决方案1】:

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。

【讨论】:

  • 谢谢你的建议,请看看我的更新:)
猜你喜欢
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 2015-11-29
  • 2018-09-17
  • 1970-01-01
  • 2020-01-15
  • 2010-09-24
  • 1970-01-01
相关资源
最近更新 更多