作为 Python 开发人员,我们通常先关注让代码正常运行,然后再担心优化它。然而,在处理大规模应用程序或性能关键型代码时,优化变得至关重要。在这篇文章中,我们将介绍两个可用于优化 Python 代码的强大工具:cProfile 模块和 PyPy 解释器。
在这篇文章的结尾,您将学到:
Python 以其易用性、可读性和庞大的库生态系统而闻名。但由于其解释性质,它也比 C 或 Java 等其他语言慢。因此,了解如何优化 Python 代码对于性能敏感的应用程序(例如机器学习模型、实时系统或高频交易系统)至关重要。
优化通常遵循以下步骤:
现在,让我们开始分析您的代码。
cProfile 是一个用于性能分析的内置 Python 模块。它跟踪代码中每个函数执行所需的时间,这可以帮助您识别导致速度变慢的函数或代码部分。
分析脚本的最简单方法是从命令行运行 cProfile。例如,假设您有一个名为 my_script.py:
的脚本
python -m cProfile -s cumulative my_script.py
解释:
这将生成您的代码花费时间的详细分类。
让我们看一个递归计算斐波那契数的基本 Python 脚本:
def fibonacci(n): if n使用 cProfile 运行此脚本:
python -m cProfile -s cumulative fibonacci_script.py了解 cProfile 输出
运行 cProfile 后,您将看到如下内容:
ncalls tottime percall cumtime percall filename:lineno(function) 8320 0.050 0.000 0.124 0.000 fibonacci_script.py:3(fibonacci)每列提供关键绩效数据:
如果您的斐波那契函数花费太多时间,此输出将告诉您优化工作的重点。
如果您只想分析特定部分,您还可以在代码中以编程方式使用 cProfile。
import cProfile def fibonacci(n): if n第 2 步:优化您的 Python 代码
使用 cProfile 确定代码中的瓶颈后,就可以进行优化了。
常见的Python优化技术
- 使用内置函数:sum()、min() 和 max() 等内置函数在 Python 中进行了高度优化,通常比手动实现的循环更快。
例子:
# Before: Custom sum loop total = 0 for i in range(1000000): total = i # After: Using built-in sum total = sum(range(1000000))
- 避免不必要的函数调用:函数调用有开销,特别是在循环内部。尽量减少冗余调用。
例子:
# Before: Unnecessary repeated calculations for i in range(1000): print(len(my_list)) # len() is called 1000 times # After: Compute once and reuse list_len = len(my_list) for i in range(1000): print(list_len)
- Memoization:对于递归函数,您可以使用memoization来存储昂贵计算的结果,以避免重复工作。
例子:
from functools import lru_cache @lru_cache(maxsize=None) def fibonacci(n): if n这通过存储每个递归调用的结果大大加快了斐波那契计算的速度。
第 3 步:使用 PyPy 进行即时编译
什么是 PyPy?
PyPy 是另一种 Python 解释器,它使用即时 (JIT) 编译来加速 Python 代码。 PyPy 将频繁执行的代码路径编译为机器代码,使其比某些任务的标准 CPython 解释器快得多。
安装 PyPy
您可以使用包管理器(例如 Linux 上的 apt 或 macOS 上的 brew)安装 PyPy:
# On Ubuntu sudo apt-get install pypy3 # On macOS (using Homebrew) brew install pypy3使用 PyPy 运行 Python 代码
安装 PyPy 后,您可以用它代替 CPython 运行脚本:
pypy3 my_script.py为什么使用 PyPy?
现在,让我们结合这些工具来全面优化您的 Python 代码。
让我们回顾一下斐波那契示例并将所有内容放在一起。
from functools import lru_cache @lru_cache(maxsize=None) def fibonacci(n): if n使用记忆化优化代码后,使用 PyPy 运行它以进一步提高性能:
pypy3 fibonacci_script.py结论
通过利用 cProfile 和 PyPy,您可以极大地优化您的 Python 代码。使用 cProfile 来识别和解决代码中的性能瓶颈。然后,使用 PyPy 通过 JIT 编译进一步提高程序的执行速度。
总之:
- 使用 cProfile 分析您的代码以了解性能瓶颈。
- 应用 Python 优化技术,例如使用内置函数和记忆化。
- 在 PyPy 上运行优化后的代码以获得更好的性能。
通过这种方法,您可以使 Python 程序运行得更快、更高效,特别是对于 CPU 密集型任务。
与我联系:
GitHub
领英
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3