【问题标题】:How to speed up Python execution?如何加快 Python 执行速度?
【发布时间】:2011-11-10 12:41:23
【问题描述】:

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

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

def foo(x):
   doSomething

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

有什么方法可以加快这个速度吗?例如通过使用多处理或其他东西? 最重要的是,它值得吗?

感谢您的回复。我想我会尝试多处理的路线。有人可以向我推荐一个指南或一些示例来帮助我吗?

【问题讨论】:

  • 你真的应该使用xrange 而不是range - 否则你把所有的“数据”放在内存中只是为了迭代它。
  • 只保留 2.x 的 lx,而不是 3.x...

标签: python performance optimization


【解决方案1】:

首先回答您的最后一个问题,如果您对性能有问题,那么这是值得的。这是唯一的标准,真的。

至于如何:

如果您的算法因为计算量大而运行缓慢,请考虑将其重写为C extension,或使用Cython,这样您就可以使用 Python 风格的语言编写快速扩展。此外,PyPy 的速度越来越快,并且可能无需修改即可运行您的代码。

如果代码的计算成本不高,但它只是循环大量,则可以使用 Multiprocessing 将其分解,因此它可以并行完成。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 好的,谢谢您的回复。好吧,我的程序只是循环了大量的数据,所以我不认为更多的优化会提高性能。所以我的问题是:使用多处理我会获得多少速度?考虑到我的项目可以概括为一百万个单元格数组中的一个循环。抱歉英语不好..:)
    • 好吧,你可以把它分成 100 个大小相等的块,并使用一个工作池来处理每个块,然后加入结果。
    【解决方案3】:

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

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

    或者您可能忘记使用 python,而只使用 ASM 编写它。当然这会更难做,但是当你看到你的程序运行速度比其他人快约 1% 时?你会很高兴你多走了一英里。

    【讨论】:

    • +1 用于提及 PyPy。另外,我很确定在汇编中重写它会给你带来超过 1% 的提升。 :)
    • 是的,但是任何对优化感兴趣的人都可以坐在角落里用闪光和安全胶水。
    • 也可以走另一条路。
    【解决方案4】:

    除了已经说过的内容之外,您还可以查看cython。但在你做之前先配置文件。此外,pypy 可能值得一试。应该不需要任何工作来使其工作。

    【讨论】:

    • 如何在不解释 pypy 和 cython 是什么的情况下获得支持?
    • 他提供了足够的链接,尽管像您的答案这样的摘要会更好。
    【解决方案5】:

    如果可以并行处理任务,您可以使用multiprocessing 模块研究使用进程池,并将作业分布在子进程之间。

    【讨论】:

      【解决方案6】:

      从前有 Pypy。 思路不错,就是比最新的python正式版总是晚了一点。

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-23
        • 1970-01-01
        相关资源
        最近更新 更多