65.9K
CodeProject 正在变化。 阅读更多。
Home

优化 Python 应用程序的性能

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2019年1月9日

CPOL
viewsIcon

8402

本文讨论了通过提高 Python 应用程序的运行速度和减少资源消耗来优化其性能的策略。

立即免费获取 Intel® Distribution for Python*!

Python 是一种功能强大的编程语言,因为它简单易学,并且拥有各种库,可以帮助程序员完成令人惊叹的任务——从构建网站到构建深度神经网络(DNN)。然而,尽管 Python 功能多样,其性能通常无法与 C 和 C++ 等编译型语言相媲美。这长期以来一直是 Python 的一个痛点。幸运的是,有方法可以有效地克服这一挑战。

本文讨论了通过提高 Python 应用程序的运行速度和减少资源消耗来优化其性能的策略。

在深入探讨这些 Python 优化策略之前,有一点需要说明:其中一些优化只需少量改动即可应用于整个代码库,而另一些则需要重写整个应用程序。使用这些方法的经验法则通常是将其应用于计算密集型的代码部分。这样可以在最小化开发时间成本的同时,获得所需的加速效果。

使用 C/C++ 函数

加速 Python 最有效的方法之一是用 C/C++ 实现代码的慢速部分,并从 Python 调用它们。正如你可能想象的那样,你可能需要根据你对这些语言的熟悉程度来选择性地使用此方法。然而,如果使用得当,你可以在享受 Python 灵活性的同时,获得接近底层硬件运行代码的部分优势。

SWIG 和 Pyrex 等工具可以轻松地将 C/C++ 代码封装到 Python 中。Python 还提供了 ctypes(从 Python 2.5 开始)用于相同的目的。这些方法各有不同,各有优势。因此,建议在选择任何一种方法之前进行一些研究。

使用 JIT 解释器

PyPy 等即时(JIT)解释器能够加速 Python 代码。这是因为 JIT 解释器顾名思义,在代码执行期间即时编译和重新编译代码。这种编译代码的方式侧重于通过分析正在运行的代码并动态找到最佳编译方式来提高性能。除了速度之外,PyPy 还减少了内存使用,并为堆栈无关模式提供了默认支持。

与前一种解决方案不同,这里不需要重写任何代码。你只需要用 PyPy 而不是 Python 运行你的代码。需要注意的是,PyPy 可能无法正确处理使用 C/C++ 扩展的代码。这是一个重要的考虑因素,特别是如果你计划在你代码中使用前一种方法。在这种情况下,你可以考虑使用 Numba,一个可以构建在 CPU 或 GPU 上执行的优化代码的编译器。Numba 可以与 PyPy 集成,以支持与 C 或 C++ 扩展不兼容的代码。

使用快速库和惯用语

Python 提供了一些默认可用的加速代码的方法,例如生成器和列表推导式。生成器通过减少 RAM 使用量来帮助加速代码,从而使迭代大型集合更有效。列表推导式还可以通过消除暂停函数帧的需求来提供加速,这与循环中发生的情况不同。这使得列表推导式比典型的循环计算量更小。

Python 还提供了 itertools 等内置库,可以创建高效的迭代器以进行高效循环。该库还为排列和组合等计算密集型任务提供高效函数。

还有一些第三方库,如 NumPy 和 Numba,它们的大部分函数是用 C 实现的,这使得它们比等效的 Python 实现更有效。这些库也针对数学和机器学习等计算密集型应用进行了优化,非常适合利用 Python 的简洁性而不牺牲性能。

降低代码复杂度和计算复杂度

一种适用于通用编程的加速 Python 代码的方法是保持代码简洁并降低代码的计算复杂度。这种加速代码的方法可能需要一些脑力劳动,不像前面的解决方案。关于保持代码简洁的想法,了解一些 Python 内置函数的实现方式非常重要。即使它们可以使你的代码更简洁,但根据你的使用方式,它们可能会增加代码的计算复杂度。在某些情况下,Python 的简洁性会起反作用,你可能需要“硬碰硬”地处理。

为了改进你的代码,可以考虑使用 Intel Vtune Amplifier 和 Intel Advisor,它们可以分析 Python 代码并找出性能瓶颈。

使用 Intel 的 Python 发行版

最后,一种非常简单的加速 Python 代码的方法是使用 Intel® Python 发行版 https://software.intel.com/en-us/distribution-for-python。请注意,这只有在你拥有 Intel 处理器时才有用,因为此发行版是为 Intel 处理器优化的。此 Python 发行版基于 Anaconda,并实现了 NumPy 等库与 Intel 的数学库,而无需更改库提供的接口。此 Python 发行版还针对 DNN 和其他形式的机器学习进行了优化。

你可以从 Intel 的官方网站免费下载此 Python 发行版 Intel 官方网站免费下载,并按照提供的说明进行安装。就像 PyPy 一样,无需对任何现有 Python 代码进行任何更改。你只需要安装新发行版并运行你的代码。这意味着无需克服新的学习曲线。

结论

有许多策略和工具可以帮助提高 Python 代码的效率。无论你最初编写的 Python 代码有多好,总有可能进一步改进它,而利用这些优化机会对于构建高性能、成本效益高的应用程序至关重要。

© . All rights reserved.