使用 cProfile 和 PyPy 模块优化 Python 代码:完整指南

使用 cprofile 和 pypy 模块优化 python 代码:完整指南

介绍

作为 python 开发人员,我们通常先关注如何让代码正常运行,然后再考虑优化。然而,在处理大规模应用程序或性能关键型代码时,优化变得至关重要。在这篇文章中,我们将介绍两个可用于优化 python 代码的强大工具:cprofile 模块和 pypy 解释器。

在这篇文章结束时,您将学到:

如何使用 cprofile 模块识别性能瓶颈。如何优化代码以提高速度。如何使用 pypy 通过即时 (jit) 编译进一步加速您的 python 程序。

为什么性能优化很重要

python 以其易用性、可读性和庞大的库生态系统而闻名。但由于其解释性质,它也比 c 或 java 等其他语言慢。因此,了解如何优化 python 代码对于性能敏感的应用程序(例如机器学习模型、实时系统或高频交易系统)至关重要。

优化通常遵循以下步骤:

立即学习“Python免费学习笔记(深入)”;

分析您的代码以了解瓶颈所在。优化代码效率低下的区域。在更快的解释器(如 pypy)中运行优化的代码,以实现最大性能。

现在,让我们开始分析您的代码。

步骤 1:使用 cprofile 分析您的代码

什么是cprofile?

cprofile 是一个用于性能分析的内置 python 模块。它跟踪代码中每个函数执行所需的时间,这可以帮助您识别导致速度变慢的函数或代码部分。

从命令行使用 cprofile

分析脚本的最简单方法是从命令行运行 cprofile。例如,假设您有一个名为 my_script.py 的脚本:

python -m cprofile -s cumulative my_script.py

登录后复制

说明:

-m cprofile:将 cprofile 模块作为 python 标准库的一部分运行。-scumulative:按每个函数花费的累积时间对分析结果进行排序。my_script.py:您的 python 脚本。

这将生成您的代码花费时间的详细分类。

示例:分析 python 脚本

让我们看一个递归计算斐波那契数的基本 python 脚本:

def fibonacci(n):    if n <= 1:        return n    return fibonacci(n-1) + fibonacci(n-2)if __name__ == "__main__":    print(fibonacci(30))

登录后复制

使用 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)

登录后复制

每列提供关键性能数据:

ncalls:调用函数的次数。tottime:函数花费的总时间(不包括子函数)。cumtime:函数(包括子函数)所花费的累计时间。每次调用:每次调用的时间。

如果您的斐波那契函数花费太多时间,此输出将告诉您优化工作的重点。

分析代码的特定部分

如果您只想分析特定部分,也可以在代码中以编程方式使用 cprofile。

import cprofiledef fibonacci(n):    if n <= 1:        return n    return fibonacci(n-1) + fibonacci(n-2)if __name__ == "__main__":    cprofile.run('fibonacci(30)')

登录后复制

第 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 <= 1:           return n       return fibonacci(n-1) + fibonacci(n-2)

登录后复制

通过存储每个递归调用的结果,大大加快了斐波那契计算的速度。

第 3 步:使用 pypy 进行即时编译

什么是 pypy?

pypy 是另一种 python 解释器,它使用即时 (jit) 编译来加速 python 代码。 pypy 将频繁执行的代码路径编译为机器代码,对于某些任务来说,它比标准 cpython 解释器快得多。

安装 pypy

您可以使用包管理器安装 pypy,例如 linux 上的 apt 或 macos 上的 brew:

# on ubuntusudo apt-get install pypy3# on macos (using homebrew)brew install pypy3

登录后复制

使用 pypy 运行 python 代码

安装 pypy 后,您可以用它代替 cpython 运行脚本:

pypy3 my_script.py

登录后复制

为什么使用 pypy?

pypy 非常适合 cpu 密集型任务,其中程序将大部分时间花在计算上(例如循环、递归函数、数字运算)。pypy 的 jit 编译器优化了最常执行的代码路径,这可以在不更改任何代码的情况下实现显着的加速。

第 4 步:结合 cprofile 和 pypy 实现最大优化

现在,让我们结合这些工具来全面优化您的 python 代码。

示例工作流程

分析您的代码使用 cprofile 来识别瓶颈。使用我们讨论的技术(内置、记忆、避免不必要的函数调用)优化您的代码使用 pypy 运行优化的代码以实现额外的性能改进。

让我们回顾一下斐波那契示例并将所有内容放在一起。

from functools import lru_cache@lru_cache(maxsize=none)def fibonacci(n):    if n <= 1:        return n    return fibonacci(n-1) + fibonacci(n-2)if __name__ == "__main__":    import cprofile    cprofile.run('print(fibonacci(30))')

登录后复制

使用记忆化优化代码后,使用 pypy 运行它以进一步提高性能:

pypy3 fibonacci_script.py

登录后复制

结论

通过利用 cprofile 和 pypy,您可以极大地优化您的 python 代码。使用 cprofile 来识别和解决代码中的性能瓶颈。然后,使用 pypy 通过 jit 编译进一步提高程序的执行速度。

总结:

使用 cprofile 分析您的代码以了解性能瓶颈。应用 python 优化技术,例如使用内置函数和记忆化。在 pypy 上运行优化后的代码以获得更好的性能。

通过这种方法,您可以使 python 程序运行得更快、更高效,特别是对于 cpu 密集型任务。

与我联系:
github
领英

以上就是使用 cProfile 和 PyPy 模块优化 Python 代码:完整指南的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2194049.html

(0)
上一篇 2025年2月25日 20:20:02
下一篇 2025年2月23日 16:51:27

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 掌握 Python 面向对象编程 (OOP):带有示例的综合指南

    介绍 面向对象编程(oop)是现代软件开发中最流行的编程范例之一。它允许您使用类和对象对现实世界的实体进行建模,使代码可重用、模块化和可扩展。在这篇博文中,我们将使用单个用例示例从基础到高级探索 python 的 oop 概念:为在线商店构…

    2025年2月25日
    200
  • 在 Python 中使用不同的文件模式和文件类型

    在这个博客系列中,我们将探索如何在 python 中处理文件,从基础知识开始,逐步进展到更高级的技术。 在本系列结束时,您将对 python 中的文件操作有深入的了解,使您能够有效地管理和操作文件中存储的数据。 该系列将由五篇文章组成,每篇…

    2025年2月25日
    200
  • python怎么写爬虫

    Python 中编写爬虫的方法:安装 requests、BeautifulSoup 和 lxml 库;导入库并创建爬虫;获取网页;解析 HTML;提取数据;处理数据;迭代抓取;处理错误;使用代理和标头。 如何使用 Python 编写爬虫 引…

    2025年2月25日
    200
  • python网络爬虫怎么写

    网络爬虫是一种自动下载和提取互联网信息的计算机程序。编写 Python 网络爬虫需遵循以下步骤:选择框架(例如 Scrapy、BeautifulSoup、Requests)分析目标网站构建请求解析响应,提取数据遍历网站保存数据处理错误速度优…

    2025年2月25日
    200
  • python 爬虫怎么运行

    要在 Python 中运行爬虫,需要安装必要的库(例如,requests、BeautifulSoup 和 lxml)。编写爬虫代码以发送 HTTP 请求、解析响应内容并提取所需数据。可以通过命令行或 IDE 运行代码。调试爬虫时,可以使用 …

    2025年2月25日
    200
  • 怎么写python爬虫

    Python 爬虫是一种用于从网站自动提取和解析数据的工具,它对于数据分析、研究和 web 刮取至关重要。编写 Python 爬虫的步骤包括:1. 安装依赖项(例如 requests、BeautifulSoup、lxml);2. 解析 HT…

    2025年2月25日
    200
  • python 爬虫怎么翻页

    Python 爬虫实现网页翻页,可通过以下步骤:使用 BeautifulSoup 查找翻页链接。获取翻页链接的 URL。使用 requests 发送请求获取下一页 HTML。解析下一页 HTML 提取数据。循环翻页并收集数据,直到达到所需页…

    2025年2月25日
    200
  • 用python怎么爬虫

    Python网络爬虫 involves using libraries like BeautifulSoup, Requests, and Scrapy to send HTTP requests, parse HTML responses…

    2025年2月25日
    200
  • Python 爬虫怎么停止

    如何停止 Python 爬虫?使用 sys.exit() 函数立即退出程序。捕获 KeyboardInterrupt 异常,在用户按下 Ctrl+C 或 Command+C 时停止爬虫。使用信号处理监视 SIGINT 信号,并设置一个信号处…

    2025年2月25日
    200
  • 爬虫python怎么跑

    Python爬虫的运行方法包括:安装BeautifulSoup4、requests和lxml库编写爬虫代码,导入库、获取URL、发送请求、解析响应运行爬虫,使用python命令执行爬虫脚本 Python爬虫的运行方法 Python爬虫的运行…

    2025年2月25日
    200

发表回复

登录后才能评论