有没有可靠的方法来在运行时检查某些Python代码是否被“cythonized”或者是否运行到标准Python解释器中?
回答这个问题是因为这个问题出现在搜索引擎上的热门回复中,而答案没有帮助。
来自 http://docs.cython.org/en/latest/src/tutorial/pure.html
import cython
if cython.compiled:
print("Yep, I'm compiled.")
else:
print("Just a lowly interpreted script.")
当我导入类似的模块并查看它们的
.__file__
属性时,我得到了
In [205]: which.__file__
Out[205]: .../which.py'
In [206]: which_cy.__file__
Out[206]: '.../which_cy.cpython-34m.so'
cythonized
模块是从.so
文件导入的,而Python源是.py
(或.pyc
)。但还有其他编译代码的方法也会创建 .so
文件。所以这不区分编译路线。
对于个别功能:
In [225]: repr(which.nonzero)
Out[225]: '<function nonzero at 0xb4dd2d1c>'
In [226]: repr(which_cy.nonzero_cy)
Out[226]: '<built-in function nonzero_cy>'
cython
不“运行”代码。它将文件(例如 *.pyx)转换为 C 代码。然后进行编译,生成可加载模块(.so
)文件。然后由 Python 解释器导入并运行。我不知道是否有办法将 .so
代码作为独立可执行文件运行。
或者,您真的想知道给定编译模块中的代码是否使用严格的 C 代码,而不是调用 Python 函数(主要是 Python 对象及其方法)?您可以查看 C 代码。两者都使用编译代码,但其中一个在检查类型、边界等方面会产生大量开销。Cython 教程的重点是如何将 Python 通用性转移到更快的 C 定义。