有哪些工具或方法可用于加速用 Python 编写的代码?

计算科学 表现 Python
2021-12-17 20:15:20

背景:我想我可能想将一些使用 Krylov 子空间方法计算矩阵指数向量乘积的代码从 MATLAB 移植到 Python。(特别是 Jitse Niesen 的expmvp函数,它使用了本文中描述的算法。)但是,我知道除非我大量使用从编译库派生的模块中的函数(即,我只使用原始 Python,而没有很多内置的在函数中),那么它可能会很慢。

问题:有哪些工具或方法可以帮助我加快用 Python 编写的代码以提高性能?特别是,我对尽可能自动化流程的工具感兴趣,尽管也欢迎通用方法。

注意:我有一个旧版本的 Jitse 算法,并且有一段时间没有使用它。让这段代码变得快速可能很容易,但我觉得它会成为一个很好的具体例子,这与我自己的研究有关。辩论我在 Python 中实现这个特定算法的方法完全是另一个问题。

4个回答

我将把我的答案分成三个部分。分析,通过c加速python代码,通过python加速python。我认为 Python 有一些最好的工具来查看代码的性能,然后深入到实际的瓶颈。在没有分析的情况下加速代码就像试图用 uzi 杀死一只鹿。

如果您真的只对 mat-vec 产品感兴趣,我会推荐scipy.sparse

用于分析的 Python 工具

profile 和 cProfile 模块:这些模块将为您提供标准运行时分析和函数调用堆栈。保存他们的统计数据非常好,使用 pstats 模块您可以通过多种方式查看数据。

kernprof:这个工具将许多例程组合在一起,用于执行逐行代码计时之类的操作

memory_profiler:此工具会逐行生成代码的内存足迹。

IPython timers:该timeit功能非常适合以快速交互的方式查看功能的差异。

加速 Python

Cython:cython 是在 python 中获取一些函数并获得更快代码的最快方法。您可以使用 python 的 cython 变体来装饰该函数,它会生成 c 代码。这是非常易于维护的,也可以很容易地链接到 c/c++/fortran 中的其他手写代码。它是迄今为止的首选工具。

ctypes:ctypes 将允许您在 c 中编写函数,然后使用其简单的代码修饰快速包装它们。它处理从 PyObjects 进行转换和管理 gil 以调用 c 函数的所有痛苦。

有其他方法可以用 C 编写代码,但它们都更多地用于获取 C/C++ 库并将其包装在 Python 中。

仅限 Python 的方法

如果您想主要留在 Python 中,我的建议是弄清楚您正在使用什么数据并选择正确的数据类型来实现您的算法。根据我的经验,你通常会通过优化数据结构比任何低级 c hack 走得更远。例如:

numpy : 一个非常快的连续数组,用于数组的跨步操作

numexpr : 一个 numpy 数组表达式优化器。它允许多线程 numpy 数组表达式,并且由于 Python 解释器的限制,还摆脱了 numpy 制作的众多临时变量。

blist:列表的 b-tree 实现,对于插入、索引和移动列表的内部节点非常快

pandas:对数组进行快速分析的数据框(或表)。

pytables:快速结构化的分层表(如 hdf5),特别适用于核外计算和大数据查询。

首先,如果有可用的 C 或 Fortran 实现(MATLAB MEX 函数?),为什么不编写 Python 包装器?

如果您想要自己的实现不仅仅是一个包装器,我强烈建议您将 numpy 模块用于线性代数的东西。确保它链接到优化的 blas(如 ATLAS、GOTOblas、uBLAS、Intel MKL,...)。并使用 Cython 或编织。阅读这篇Performance Python文章以获得很好的介绍和基准测试。本文中的不同实现可在此处下载,由 Travis Oliphant(Numpy-guru)提供。

祝你好运。

基本上我同意其他答案。快速数字代码的最佳选择python

  • 使用专门的库,如numpy
  • 包装您现有的代码,以便您的python-program 可以直接调用它

但是,如果您想从头开始编写整个算法(我引用:“我只使用原始 Python”),那么您可能需要考虑http://pypy.org/的 JIT(即时)实现python我无法在我的项目中使用它(因为它依赖于numpy并且这些pypy人正在努力支持它)但是基准非常令人印象深刻(http://speed.pypy.org/

上面的一些链接已经过时,因此请看这里:

http://wiki.scipy.org/PerformanceTips

http://wiki.scipy.org/PerformancePython

一些想法:

Numpy、Numba、Cython、Numexpr、Theano、Tensorflow、f2py、CPython C API、pypy、cffi、Pythran、Nuitka、swig、boost.python