如何知道我的代码是通过 Cython 还是标准 Python 解释器运行?

问题描述 投票:0回答:2

有没有可靠的方法来在运行时检查某些Python代码是否被“cythonized”或者是否运行到标准Python解释器中?

python cython
2个回答
16
投票

回答这个问题是因为这个问题出现在搜索引擎上的热门回复中,而答案没有帮助。

来自 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.")

5
投票

当我导入类似的模块并查看它们的

.__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 定义。

© www.soinside.com 2019 - 2024. All rights reserved.