《Python高性能编程》——第2章 通过性能分析找到瓶颈 2.1 高效地分析性能

简介:

本节书摘来自异步社区《Python高性能编程》一书中的第2章,第2.1节,作者[美] 戈雷利克 (Micha Gorelick),胡世杰,徐旭彬 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

第2章 通过性能分析找到瓶颈

读完本章之后你将能够回答下列问题

  • 如何找到代码中速度和RAM的瓶颈?
  • 如何分析CPU和内存使用情况?
  • 我应该分析到什么深度?
  • 如何分析一个长期运行的应用程序?
  • 在CPython台面下发生了什么?
  • 如何在调整性能的同时确保功能的正确?

性能分析帮助我们找到瓶颈,让我们在性能调优方面做到事半功倍。性能调优包括在速度上巨大的提升以及减少资源的占用,也就是说让你的代码能够跑得“足够快”以及“足够瘦”。性能分析能够让你用最小的代价做出最实用的决定。

任何可以测量的资源都可以被分析(不仅是CPU!)。我们在本章将分析CPU的时间和内存的占用。你也可以将同样的技术用于分析网络带宽和磁盘I/O。

如果一个程序跑得太慢或占用了太多RAM,那么你一定希望把有问题的代码修正。当然,你完全可以跳过性能分析,修正你认为可能有问题的地方——但是小心,你很有可能“修正了”错误的地方。比起依靠你的直觉,更有效率的做法是先进行性能分析,做出一个假设,然后再改动你的代码结构。

人有时候懒点比较好。先进行性能分析让你能够迅速定位需要被解决的瓶颈,然后你就可以用最小的改动获得你需要的性能提升。如果你回避性能分析直接进行优化,那么你很有可能最终付出了更多的努力。优化应该总是基于性能分析的结果。

2.1 高效地分析性能

性能分析的首要目标是对受测系统进行测试来发现哪里太慢(或占用太多RAM,或导致太多磁盘I/O或网络I/O)。性能分析一般会导致额外的性能开销(一般会慢10到100倍),但你依然希望你的代码尽可能像是在真正的环境中一样运行。所以要以测试用例的方式将你需要测试的那部分系统独立出来。最好这个测试用例已经使用了一套自己的模块。

本章介绍的第一个基本技术包括IPython的%timeit魔法函数,time.time(),以及一个计时修饰器。你可以使用这些技术来了解语句和函数的行为。

然后我们会学习cProfile(2.6节),告诉你如何使用这个内建工具来了解代码中哪些函数耗时最长。这将让你站在高处俯瞰你的问题,使你能够将注意力集中到关键函数上。

接下来,我们会去看line_profiler(2.8节),这个工具能够对你选定的函数进行逐行分析。其结果将包含每行被调用的次数以及每行花费的时间百分比。这恰能让你知道是哪里跑得慢以及为什么。

有了line_profiler的结果,你就有了足够的信息去使用编译器(第7章)。

在第6章(例6-8),你将学到如何使用perf stat命令来了解最终执行于CPU上的指令的个数以及CPU缓存的利用率。这让你能够进一步调优矩阵操作。读完本章后你应该去看看那个例子。

line_profiler之后,我们会演示heapy(2.10节),它可以追踪Python内存中所有的对象——这对于消灭奇怪的内存泄漏特别有用。如果你的系统需要持续运行,那么你会对dowser(2.11节)感兴趣,它让你能够通过一个Web浏览器界面审查一个持续运行的进程中的实时对象。

为了帮助你了解为什么你的RAM占用特别高,我们会给你演示memory_profiler(2.9节)。它能以图的形式展示RAM的使用情况随时间的变化,这样你就可以向你的同事们解释为什么某个函数占用了比预期更多的RAM。

 备忘 

无论你用什么方法分析代码性能,都必须记得用足够的单元测试覆盖你的代码。单元测试能帮助你避免愚蠢的错误并让你的结果可重现。没有单元测试风险极大。

在编译或重写你的算法之前始终进行性能分析。你需要证据来决定最有效的优化手段。

最后,我们还会给你介绍CPython中的Python字节码(2.12节),这样你就能够了解在其台面下发生了什么。具体来说,了解基于栈的Python虚拟机如何运行将帮助你明白为什么某个编程风格会跑得比别人慢。

在结束本章之前,我们会回顾如何在性能分析中集成单元测试(2.13节),让代码跑得更有效的同时维持正确。

最后我们将讨论性能分析的策略(2.14节),这样你就能够可靠地分析你的代码并收集正确的数据来验证你的假设。在这里,你将了解到动态CPU频率以及TurboBoost等特性能够如何歪曲你的性能分析结果以及如何禁用这些功能。

为了讲解所有这些步骤,我们需要以一个便于分析的函数为例。下一节我们介绍Julia集合。这是一个对RAM有一点饥渴的CPU密集型函数,而且它还具有非线性的行为(这样我们就无法轻易预测其结果),这意味着我们需要在运行时分析其性能而没法进行线下调查。

相关文章
|
21天前
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现智能食品消费模式分析的深度学习模型
使用Python实现智能食品消费模式分析的深度学习模型
113 70
|
21天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
20天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
8天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
101 80
|
19天前
|
机器学习/深度学习 数据采集 数据挖掘
使用Python实现智能食品消费市场分析的深度学习模型
使用Python实现智能食品消费市场分析的深度学习模型
96 36
|
13天前
|
数据可视化 算法 数据挖掘
Python量化投资实践:基于蒙特卡洛模拟的投资组合风险建模与分析
蒙特卡洛模拟是一种利用重复随机抽样解决确定性问题的计算方法,广泛应用于金融领域的不确定性建模和风险评估。本文介绍如何使用Python和EODHD API获取历史交易数据,通过模拟生成未来价格路径,分析投资风险与收益,包括VaR和CVaR计算,以辅助投资者制定合理决策。
60 15
|
17天前
|
机器学习/深度学习 数据采集 数据挖掘
使用Python实现智能食品消费趋势分析的深度学习模型
使用Python实现智能食品消费趋势分析的深度学习模型
77 18
|
7天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
30 2
|
20天前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
44 10
|
21天前
|
IDE 程序员 开发工具
Python编程入门:打造你的第一个程序
迈出编程的第一步,就像在未知的海洋中航行。本文是你启航的指南针,带你了解Python这门语言的魅力所在,并手把手教你构建第一个属于自己的程序。从安装环境到编写代码,我们将一步步走过这段旅程。准备好了吗?让我们开始吧!