Python模块是否已编译?

dar*_*ace 4 python numpy compilation

试图了解python库是否已编译,因为我想知道我编写的解释代码是执行相同还是更差.

例如,我看到它在某处提到numpy和scipy是有效的,因为它们是编译的.我不认为这意味着字节码被编译,所以这是怎么做到的?它是用cython这样的东西编译成c的吗?或者它是使用像c这样的语言编写的,并以兼容的方式编译?

这是适用于所有模块还是根据具体情况而定?

jee*_*cat 5

NumPy和其他几个库是用C语言和其他语言(如FORTRAN)编写的代码的部分包装器,它们在编译时运行速度比Python快.这有助于避免Python中的循环,指针间接和每元素动态类型检查的成本.这个问题这个问题中解释:

Numpy数组是密集的同类型数组.相比之下,Python列表是指向对象的指针数组,即使它们都属于同一类型.因此,您可以获得参考地点的好处.

此外,许多Numpy操作在C中实现,避免了Python中的循环,指针间接和每元素动态类型检查的一般成本.速度提升取决于您正在执行的操作,但在数字运算程序中,几个数量级并不罕见.

编译为字节码(.pyc文件)的Python代码是一个单独的主题,其中编译python脚本以提高启动性能(请参阅此问题).

  • 如果您查看 [Install docs for NumPy](http://docs.scipy.org/doc/numpy-1.10.1/user/install.html#building-from-source),您可以看到许多NumPy 模块需要 C 或 FORTRAN 编译器。AFAIK 许多科学和数学库使用低级语言,包括许多 SciPy 堆栈。 (2认同)

hpa*_*ulj 1

Python 可以执行用 Python 编写的函数(解释型)和编译函数。有关于编写与 Python 集成的代码的完整 API 文档。 cython是执行此操作的更简单的工具之一。

库可以是任意组合 - 纯 Python、Python 加编译代码的接口,或者全部编译。解释后的文件以 结尾.py,编译后的文件通常是.so.dll(取决于操作系统)。安装纯 Python 代码很容易 - 只需加载、解压(如果需要),然后放入正确的目录。混合代码需要编译步骤(因此需要 ac 编译器等),或者下载带有二进制文件的版本。

通常,开发人员让代码在 Python 中运行,然后在c. 或者他们找到一些外部工作库cFortran代码,并链接到它。

numpy并且scipy是混合的。它们有大量的 Python 代码、核心编译部分,并使用外部库。而且c代码可能非常难以阅读。

作为numpy用户,您应该首先尝试使用 Python 代码获得尽可能多的清晰度和性能。大多数优化 SO 问题讨论了使用编译功能的方法numpy- 对整个数组起作用的所有操作。只有当你无法用高效的 numpy 代码表达你的操作时,你才需要求助于使用像cythonor 这样的工具numba

一般来说,如果您必须进行广泛的迭代,那么您正在使用低级操作。要么用数组操作替换循环,要么在 cython 中重写循环。