我将把我的答案分成三个部分。分析,通过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),特别适用于核外计算和大数据查询。