如何加快Python执行速度?

时间:2011-11-10 12:41:24

标签: python performance optimization

我有一个用Python编写的项目,它可以处理大量数据。 我想加快执行时间。

简单来说,假设我有这个示例完全优化的代码:

def foo(x):
   doSomething

main():
   for i in range(1,10000000):
      foo(i)

有没有办法加快这个?例如,通过使用多处理或其他东西? 最重要的是,它值得吗?

感谢您的回复。我想我会尝试多处理的路线。有人可以建议我指导或帮助我的一些例子吗?

6 个答案:

答案 0 :(得分:9)

首先回答你的上一个问题,如果你遇到性能问题,那就值得了。这是唯一的标准,真的。

关于如何:

如果您的算法速度慢,因为它的计算成本很高,请考虑将其重写为C extension,或使用Cython,这样您就可以用Python式语言编写快速扩展。此外,PyPy越来越快,可能无需修改即可运行代码。

如果代码的计算成本不高,但它只是循环很大,可以通过Multiprocessing将其分解,这样就可以并行完成。

最后,如果这是某种基本数据分散任务,请考虑使用快速数据存储。所有主要的关系数据库都在wazoo上进行了优化,您可能会发现只需让数据库为您完成任务就可以加快您的任务。您甚至可以将其塑造成适合Redis商店,这可以很好地聚合大数据集。

答案 1 :(得分:7)

唯一的真正的方式是分析和衡量。你的代码可以做任何事情。 “doSomething”可能是time.sleep(10),在这种情况下,分离10000000进程将使整个程序在大约10秒内运行(忽略分叉开销并导致减速)。

使用http://docs.python.org/library/profile.html并检查瓶颈的位置,看看是否可以使用更好的编码优化“完全优化”程序。如果它已经足够快,请停止。

然后,根据它的CPU或I / O限制以及您拥有的硬件,您可能想尝试多处理或线程化。如果你的问题可以解决,你也可以尝试分发到多台机器并做一些map / reduce事情。

答案 2 :(得分:3)

你可以使用内置JIT编译器的PyPy解释器,它实际上可以提高像这样的循环的性能。这是一个link,它解释了PyPy解释器提供的常规CPython的一些加速。

或者您可以使用Cython编写代码,它允许在python中使用本机c扩展。大量的numpy以这种方式编写,以获得良好的加速。

或者你可以忘记使用python并在ASM中编写它。当然,当你看到你的程序运行速度比所有人的快1%时,它会更难做到吗?你会很高兴你加倍努力。

答案 3 :(得分:2)

除了已经说过的话,你可以查看cython。但是在你做之前做个人资料此外,pypy可能值得一试。不应该做任何工作来使其发挥作用。

答案 4 :(得分:0)

如果可以并行处理任务,您可以使用multiprocessing模块调查使用流程池,并将作业分配到子流程中。

答案 5 :(得分:0)

从前有个Pypy。 这个主意不错,但与最新的python官方版本相比总是有点晚。

今天我发现了Numba。 它似乎比Pypy更快,更兼容。

我建议作为这篇好文章的介绍。它比较了多种优化和加速结果:

https://www.ibm.com/developerworks/community/blogs/jfp/entry/Python_Meets_Julia_Micro_Performance?lang=en