跳转到主要内容

如何加快Python代码的运行速度?

Saeed Amen
Saeed Amen
Founder of Cuemacro

由于编写程序相对容易,Python语言在金融服务行业中越来越流行。但是,与其他语言相比,Python的运行速度较慢。本文作者Saeed Amen是一位宽客,也是《另类数据之书》(The Book of Alternative Data) 的合著者之一。他在本文中探讨了加快Python代码运行速度的方法。


  1. 尽管Python比Java或C ++等编程语言更易于编写,但它的运行速度却要慢得多。有多种方法可以加快您的Python代码的运行速度,然而每种方法都需要在某种程度上重写代码。
  2. 技术上包括结合Pandas或者NumPy库采用矢量化数据处理替换循环。并且,您可以使用Python库引入并行化,将数据计算移至Python环境之外。
  3. 使用Cython可以编写类似于Python的代码并将其编译为C代码,进而向下编译为高速的机器语言代码。Numba也可以将Python和NumPy代码转换为机器语言代码。

要在收件箱中获取更多数据驱动的见解,请订阅 Refinitiv Perspectives 每周新闻

Python语言在金融服务行业中越来越流行

造成这种增长的原因之一是Python中大批数据科学专用库的广泛使用。例如,几年前,如果要进行财务分析,需要花费数月时间来编写处理时间序列数据的库函数。今天,我们有了Pandas,这是一个非常完善的操作时间序列的程序库。

相对而言,Python代码比C ++等语言更容易开发。因此,金融机构中不管是不是技术人员,相当多的人都在学习Python,例如交易员和风险管理人员。

但是,尽管Python代码相当直观且易于编写,但比起其他语言,运行速度相对较慢。虽然它比R之类的语言运行起来要快,但和Java和C ++之类的语言相比却逊色很多。

然而从另一方面来说,用C ++编写相同逻辑的代码要花费更长的时间。

路孚特实验室如何运用数据?

让Python代码运行更快的技巧

那么如何提高Python代码的运行速度呢?

无论是在计算用时还是内存使用情况上,代码概要分析都可以识别出我们代码的哪些部分是瓶颈。一旦发现瓶颈,就可以尝试多种解决方案。

如果数据计算中有许多循环,那么第一件要尝试的事情是采用Pandas(或者更快的NumPy)之类的库对代码中的数据和结构进行矢量化改造。

您还可以采用多线程和多进程Python库使得代码执行并行化,此外,有许多上层包装程序可以简化这个过程,例如concurrent.futures。

对于读磁盘或下载数据这类 I/O 密集型的操作,多线程更为适合。与此同时,多进程更适合计算密集型的任务,例如风险计算。

然后,您可以选择在更多的计算核心上运行这些任务以加快速度。在云上运行可以进一步扩展代码可用的计算资源。还有其他代码并行化的方法,例如使用Dask,它还使您的程序能够处理比内存大得多的数据集。

在数据库中进行更多计算

另外,您可以选择在Python外部运行非常繁重的数据计算。例如在SQL数据库中,SQLAlchemy可以使用Python创建SQL查询。

如果您使用的是高频逐笔成交数据,那么KDB数据库也许是一个好选择,尽管您需要了解q这种具有挑战性的语言。基本思路是在KDB内部进行计算,然后在Python代码中使用qPython库对结果完成输出。

显然,交给KDB的运算量越多(从而减少Python代码量),则需要编写的q语言代码越多。值得注意的是,与这里讨论的多数解决方案不同,KDB不是开源的。

Spark分析引擎也可用于数据处理,并且Koalas库为您提供了一个类似于Pandas的接口,可以在Spark上操作时间序列数据,使得数据处理变得更加容易。

Cython和C代码

用Cython重写代码的某些部分也会有所帮助。Cython语言是Python的超集,可以让您调用C函数和声明C类型。进而由Cython生成C代码,静态编译为机器语言代码。

Numba是即时编译器,可以将Python和NumPy代码转换为更快的机器语言代码。与Cython一样,您通常需要重写程序以便Numba优化运行速度。

PyPy是除CPython之外的另一种方案,并且速度更快。缺点是,尽管它最近开始支持Pandas和NumPy,但它无法与每一个Python库兼容。

有很多方法可以加快Python代码的运行速度,但是它们通常需要重写您的源代码库。诀窍是花足够的时间来达到足够理想的速度。如果最终证明这个过程耗时良久,那么最好是一开始就选用C ++或Java这样的编程语言。

路孚特实验室如何运用数据?