《Python高性能编程》——2.14 确保性能分析成功的策略

简介:

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

2.14 确保性能分析成功的策略

性能分析需要一些时间和精力。如果你把需要测试的代码段跟你代码的主体分离,你会有一个更好的机会去了解你的代码。然后你可以用单元测试来保证正确性,你还可以传入精心编造的真实数据来测试算法的有效性。

记得关闭任何基于BIOS的加速器,因为它们只会混淆你的结果。Ian的笔记本电脑使用的Intel TurboBoost功能可以在温度足够低的时候将CPU暂时加至极速。这意味着低温时运行同一段代码的速度可能比高温时要快。你的操作系统也许还控制了时钟的速度——使用电池电源的笔记本可能比插了主电源时更积极地控制CPU的速度。为了建立一个更加稳定的测试配置,我们:

  • 在BIOS上禁用了TurboBoost。
  • 禁用了操作系统改写SpeedStep(如果你有权限,你可以在你的BIOS中找到它)的能力。
  • 只使用主电源(从不使用电池电源)。
  • 运行实验时禁用后台工具如备份和Dropbox。
  • 多次运行实验来获得一个稳定的测量结果。
  • 如果可能,降至run level 1(UNIX),确保没有其他任务运行。
  • 重启并重跑实验来二次验证结果。

试着假设你代码的行为并用性能分析的结果来证实(或证伪)你的假设。你的选择不会改变(因为你的决定只能基于性能分析后的结果),但是你对代码的直觉了解会提升,而这会在今后的项目中带来好处,因为你会变得更能做出高效的决定。当然,你依然需要性能分析来验证这些高效的决定。

不要克扣准备工作。如果你在测试一段深入大型项目的代码前不先将代码分离,你很有可能会因为一些副作用而让你的努力偏离正轨。当你进行细粒度的改动时,对大型项目进行单元测试往往会更困难,而这又会更进一步妨碍你的努力。副作用可能包括其他线程或进程影响了CPU和内存的使用以及网络和磁盘的活动,这些都会歪曲你的结果。

对于Web服务器,推荐dowser和dozer;你可以用它们来将名字空间中的对象行为实时可视化。如果可能,一定要将你想测试的代码从Web应用的主体上分离出来,这会让性能分析方便太多。

确保你的单元测试覆盖了所有你想要分析的代码路径。任何你没有测过的东西都有可能带来细微的错误拖慢你的进度。使用coverage.py来确认你的测试覆盖了所有的代码路径。

对一个生成很多数字输出的复杂代码段进行单元测试可能会很困难。不要害怕将结果输出到一个文本文件来运行diff或者使用一个pickled对象。对于数字优化的问题,Ian喜欢创建一个包含了大量浮点数的长文本文件并使用diff——细小的取整问题会立刻显现,哪怕它们在输出中很罕见。

如果你的代码容易受到数字取整问题的影响,那么你最好有一个大的输出可以用来进行前后对比。取整错误的一个原因是CPU寄存器和主存之间的浮点精度不同。你的代码在不同的代码路径上运行可能导致细微的取整错误并在之后给你带来困扰——所以最好在它们刚发生的时候就尽早意识到这点。

显然,在性能分析和优化时使用源代码控制工具是很有意义的。创建新的代码分支代价很低,而且它能让你保持头脑清醒。

相关文章
|
5月前
|
数据采集 NoSQL 关系型数据库
Python爬虫去重策略:增量爬取与历史数据比对
Python爬虫去重策略:增量爬取与历史数据比对
|
24天前
|
机器学习/深度学习 算法 调度
【EI复现】基于深度强化学习的微能源网能量管理与优化策略研究(Python代码实现)
【EI复现】基于深度强化学习的微能源网能量管理与优化策略研究(Python代码实现)
|
2月前
|
存储 监控 算法
基于 Python 跳表算法的局域网网络监控软件动态数据索引优化策略研究
局域网网络监控软件需高效处理终端行为数据,跳表作为一种基于概率平衡的动态数据结构,具备高效的插入、删除与查询性能(平均时间复杂度为O(log n)),适用于高频数据写入和随机查询场景。本文深入解析跳表原理,探讨其在局域网监控中的适配性,并提供基于Python的完整实现方案,优化终端会话管理,提升系统响应性能。
67 4
|
3月前
|
Python
Python编程基石:整型、浮点、字符串与布尔值完全解读
本文介绍了Python中的四种基本数据类型:整型(int)、浮点型(float)、字符串(str)和布尔型(bool)。整型表示无大小限制的整数,支持各类运算;浮点型遵循IEEE 754标准,需注意精度问题;字符串是不可变序列,支持多种操作与方法;布尔型仅有True和False两个值,可与其他类型转换。掌握这些类型及其转换规则是Python编程的基础。
209 33
|
2月前
|
数据采集 分布式计算 大数据
不会Python,还敢说搞大数据?一文带你入门大数据编程的“硬核”真相
不会Python,还敢说搞大数据?一文带你入门大数据编程的“硬核”真相
78 1
|
4月前
|
人工智能 并行计算 开发者
CUDA重大更新:原生Python可直接编写高性能GPU程序
NVIDIA在2025年GTC大会上宣布CUDA并行计算平台正式支持原生Python编程,消除了Python开发者进入GPU加速领域的技术壁垒。这一突破通过重新设计CUDA开发模型,引入CUDA Core、cuPyNumeric、NVMath Python等核心组件,实现了Python与GPU加速的深度集成。开发者可直接用Python语法进行高性能并行计算,显著降低门槛,扩展CUDA生态,推动人工智能、科学计算等领域创新。此更新标志着CUDA向更包容的语言生态系统转型,未来还将支持Rust、Julia等语言。
336 3
CUDA重大更新:原生Python可直接编写高性能GPU程序
|
4月前
|
数据可视化 数据挖掘 数据安全/隐私保护
Python实现时间序列动量策略:波动率标准化让量化交易收益更平稳
时间序列动量策略(TSMOM)是一种基于资产价格趋势的量化交易方法,通过建立多头或空头头寸捕捉市场惯性。然而,传统TSMOM策略因风险敞口不稳定而面临收益波动问题。波动率调整技术通过动态调节头寸规模,维持恒定风险水平,优化了策略表现。本文系统分析了波动率调整TSMOM的原理、实施步骤及优势,强调其在现代量化投资中的重要地位,并探讨关键参数设定与实际应用考量,为投资者提供更平稳的风险管理体验。
151 4
Python实现时间序列动量策略:波动率标准化让量化交易收益更平稳
|
3月前
|
设计模式 安全 Python
Python编程精进:正则表达式
正则表达式是一种强大的文本处理工具,用于搜索、匹配和提取模式。本文介绍了正则表达式的语法基础,如`\d`、`\w`等符号,并通过实例展示其在匹配电子邮件、验证电话号码、处理日期格式等场景中的应用。同时,文章提醒用户注意性能、编码、安全性等问题,避免常见错误,如特殊字符转义不当、量词使用错误等。掌握正则表达式能显著提升文本处理效率,但需结合实际需求谨慎设计模式。
134 2
|
3月前
|
网络协议 API Python
解析http.client与requests在Python中的性能比较和改进策略。
最后,需要明确的是,这两种库各有其优点和适用场景。`http.client` 更适合于基础且并行的请求,`requests` 则因其易用且强大的功能,更适用于复杂的 HTTP 场景。对于哪种更适合你的应用,可能需要你自己进行实际的测试来确定。
111 10
|
3月前
|
测试技术 Python
Python测试报告生成:整合错误截图,重复用例执行策略,调整测试顺序及多断言机制。
如何组织这一切呢?你可以写一本名为“Python测试之道”的动作指南手册,或者创建一个包含测试策略、测试顺序、多断言机制的脚本库。只要你的测试剧本编写得足够独到,你的框架就会像一位执行任务的超级英雄,将任何潜伏于代码深处的错误无情地揪出来展现在光天化日之下。这些整理好的测试结果,不仅有利于团队协作,更像冒险故事中的精彩篇章,带给读者无尽的探索乐趣和深刻的思考。
104 10

热门文章

最新文章

推荐镜像

更多