本文将提供一些工具来优化你的代码。会使代码更简洁,或者更快。当然,这些不能代替算法设计,但还是可以让Python提速很多倍。其实之前关于算法的文章也有提到。比如deque适用于双向队列,在合适的条件下使用bisect和heapq来提高算法的性能。而且如前所述,Python提供了当今最先进、最高效的排序算法(list.sort)。还有一个通用且快速的哈希表(dict)。如果您编写迭代器包装器、功能代码或某种额外的扩展,也许可以使用CyToolz。当然,在itertools和functools模块中,有很多函数可以带来非常高效的代码。本文主要讲优化单处理器的代码。下面将介绍一些高效的功能实现,以及封装的扩展模块,包括更快的Python解释器。当然,多处理器版本可以大大提高运行效率。如果想学习多核编程,可以从multiprocessing模块入手。而且你还可以找到很多关于分布式计算的第三方工具。这里可以看看Pythonwiki上关于ParallelProcessing的内容。接下来说一下Python加速工具的菜单。1.NumPy、SciPy、Sage和Pandas首先,NumPy。它的核心是多维数字数组的实现。除了这个数据结构之外,还实现了几个函数和运算符来有效地执行数组操作。并且简化了调用次数。它可用于执行极其高效的数学运算。SciPy和Sage都内置了NumPy作为它们自身的一部分,以及为特定的科学、数学和高性能计算模块内置的各种其他工具。Pandas是一个专注于数据分析的工具。如果你正在处理大量的半结构化数据,你也可以使用Pandas相关的工具,比如Blaze。2.PyPy、Pyston、Parakeet、Psyco和UnladenSwallow让代码运行得更快,侵入性最小的是使用实时编译器(JIT编译)。以前我们可以直接安装Psyco。安装后导入psyco,然后调用psyco.full()。可以显着提高代码执行速度。在运行Python代码时,它可以实时监控程序,并将部分代码编译成机器码。现在Psyco等很多加速器项目已经停止维护,但是PyPy中却继承了类似的功能。为了便于分析、优化和翻译,PyPy用Python语言重新实现了Python,使其可以进行JIT编译。而PyPy可以直接将代码翻译成C等更高性能的语言。UnladenSwallow是一个PythonJIT编译器。是Python解释器的一个版本,称为低级虚拟机(LLVM)。然而,这种发展已经停止。Pyston是一个更接近LLVM平台的PythonJIT编译器。在很多情况下,它已经比Python的实现要好,但是还有很多地方不够完美。3、在图像处理单元中使用了GPULib、PyStream、PyCUDA和PyOpenCL这四个来实现代码加速。前面说的是通过代码优化来实现加速。而这些都是在硬件层面加速的。如果有强大的GPU,我们可以使用GPU来计算,从而减少CPU的宝贵资源。PyStream有点老。GPULib提供了基于GPU的多种形式的数据计算。如果你使用GPU来加速你自己的代码,你可以使用PyCUDA和PyOpenCL。4.Pyrex、Cython、Numba、Shedskin这四个项目都致力于将Python代码翻译成C、C++、LLVM代码。Shedskin会将代码编译为C++语言。Pyrex和Cython编译的主要对象是C语言。Cython也是Pyrex的一个分支。此外,Cython还额外支持NumPy数组。如果是面向数组和数学计算,Numba是更好的选择,导入时会自动生成对应的LLVM代码。升级版是NumbaPro,同样提供对GPU的支持。5.SWIG、F2PY、Boost.Python等工具可以将其他语言打包为Python模块。第一个可以封装C/C++语言。F2PY可以包装Fortran。Boost.Python可以封装C++语言。SUIG只需要启动一个命令行工具,将C或C++头文件输入进去,wrapper代码就会自动生成。除了Python之外,它还可以作为其他语言的包装器,例如Java和PHP。6、ctypes、llvm-py、CorePy2等模块可以帮助我们实现对Python底层对象的操作。ctypes模块可用于在内存中构造已编译的C对象。并调用共享库中的C函数。但是,ctypes已经包含在Python标准库中。llvm-py主要提供LLVM的Python接口。为了构建代码,然后编译它们。也可以用Python构建其编译器。当然,也可以想出自己的编程语言。CorePy2也可以加速,但是这个加速是运行在汇编层的。7.Weave、Cinpy和PyInline这三个包让我们可以直接在Python代码中使用C语言或者其他高级语言。混合代码并保持干净。你可以利用Python代码字符串的多行特性,根据自己的风格对其他代码进行排版。8.其他工具如果我们要节省内存,就不能使用JIT。一般JIT会消耗太多内存。有句话说的对,时间和记忆往往是不相容的,我们总是要在工程开发中找到它们的平衡点。至于其他的,比如MicroPython项目,这个是用在嵌入式设备或者微控制器上的。如果你只是想在Python环境中工作,然后想使用其他语言,你可以看看Julia项目。以上就是本次分享的全部内容。想了解更多python知识,请前往公众号:Python编程学习圈,发“J”免费领取,每日干货分享
