Python模块是否已编译?

时间:2016-09-27 11:02:47

标签: python numpy compilation

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

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

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

2 个答案:

答案 0 :(得分:5)

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

中有解释
  

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

     

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

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

答案 1 :(得分:1)

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

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

通常,开发人员使用Python编写代码,然后在c中重写速度敏感部分。或者他们找到一些工作cFortran代码的外部库,并链接到该代码。

numpyscipy混合在一起。他们有许多Python代码,核心编译部分,并使用外部库。 c代码可能非常难以阅读。

作为numpy用户,您应首先尝试使用Python代码获得尽可能多的清晰度和性能。大多数SO优化问题都讨论了如何利用numpy的编译功能 - 所有对整个数组都有效的操作。只有当您无法使用高效的numpy代码表达您的操作时,才需要使用cythonnumba等工具。

一般情况下,如果必须进行大量迭代,那么您正在使用低级操作。用数组操作替换循环,或用cython重写循环。

相关问题