2016-09-27 49 views
2

试图了解是否编译python库,因为我想知道我编写的解释代码是否会执行相同或更差。Python模块是否被编译?

例如我看到它在某处提到numpy和scipy是有效的,因为它们被编译。我不认为这意味着编译字节码,所以这是如何完成的?是否使用类似cython的东西编译为c?还是它使用像c这样的语言编写,并以兼容的方式进行编译?

这是否适用于所有模块,还是在个案基础上?

回答

4

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

numpy数组是密集排列的均匀类型。相比之下,Python列表是指向对象的指针数组,即使它们都是相同类型的。所以,你可以获得参考地的好处。另外,许多Numpy操作都在C中实现,避免了Python中循环的一般开销,指针间接和每元素动态类型检查。速度提升取决于你正在执行哪些操作,但在数字处理程序中几个数量级并不少见。被编译成字节码(pyc文件)

Python代码是一个独立的主题,其中Python脚本编译以提高启动性能(见this question)。

+0

Riiight,所以它取决于特定的库以及它是如何构建的。理论上,如果我想创建自己的高效Python库,我可以用另一种语言来构建它,然后为它写一个包装器,就像你刚才提到的那样。你有任何想法,如果'广泛使用'的Python库是这样写的?我该如何检查? – darkace

+1

如果你看看[安装NumPy的文档](http://docs.scipy.org/doc/numpy-1.10.1/user/install.html#building-from-source),你可以看到很多NumPy模块需要C或FORTRAN编译器。 AFAIK许多科学和数学图书馆都使用较低级的语言,包括很多SciPy协议栈。 – jeevcat

1

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

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

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

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

作为numpy用户,您应该首先尝试使用Python代码获得尽可能多的清晰度和性能。大多数SO优化问题讨论了如何使用编译的功能numpy - 所有在整个阵列上运行的操作。只有当你无法用有效的numpy代码表达你的操作时,你需要使用像cythonnumba这样的工具。

一般而言,如果您必须进行大量迭代,那么您使用的是低级别操作。用数组操作替换循环,或者在cython中重写循环。