我将答案分为三个部分。分析,通过c加快python代码的速度,并通过python加快python的速度。我认为Python拥有一些最好的工具,可用来查看您的代码的性能然后深入到实际的瓶颈。在不进行概要分析的情况下加速代码就像试图用uzi杀死一只鹿一样。
如果您真的只对mat-vec产品感兴趣,我建议scipy.sparse。
用于剖析的Python工具
profile和cProfile模块:这些模块将为您提供标准的运行时分析和函数调用堆栈。保存他们的统计信息非常好,使用pstats模块,您可以通过多种方式查看数据。
kernprof:此工具汇集了许多例程,用于逐行代码计时
memory_profiler:此工具逐行生成代码的内存足迹。
IPython计时器:该timeit
函数非常适合以快速交互的方式查看函数中的差异。
加快Python
Cython:cython是在python中采用一些功能并获得更快代码的最快方法。您可以使用python的cython变体来装饰函数,并且它会生成c代码。这是非常可维护的,并且还可以很容易地链接到c / c ++ / fortran中的其他手写代码。到目前为止,它是当今首选的工具。
ctypes:ctypes允许您用c编写函数,然后用其简单的代码修饰快速包装它们。它处理了从PyObjects进行转换和管理gil调用c函数的所有痛苦。
还有其他方法可以用C编写代码,但是对于采用C / C ++库并将其包装在Python中的方法,则更多。
仅限Python的方法
如果您想主要留在Python中,我的建议是弄清楚您正在使用什么数据,并选择正确的数据类型来实现算法。根据我的经验,与其他任何底层c技巧相比,通过优化数据结构通常可以使您走得更远。例如:
numpy:非常快的连续数组,用于数组的跨步操作
numexpr:numpy数组表达式优化器。它允许多线程numpy数组表达式,并且由于python解释器的限制,还摆脱了numpy产生的大量临时变量。
blist:列表的b树实现,非常快地用于插入,索引和移动列表的内部节点
pandas:数据框(或表)对阵列的分析非常快。
pytables:快速结构化的分层表(如hdf5),特别适合于核心计算和对大数据的查询。