在分析python代码性能瓶颈,但又不想修改源代码的时候,ipython shell以及第三方库提供了很多扩展工具,可以不用在代码里面加上统计性能的装饰器,也能很方便直观的分析代码性能。下面以我自己实现的一个快排代码为例,带你使用集中不同的性能分析工具。
def quick_sort(data, low, high):
if low >= high:
return
left, right = low, high
key = data[left]
while left < right:
while left < right and data[right] >= key:
right -= 1
data[left] = data[right]
while left < right and data[left] <= key:
left += 1
data[right] = data[left]
data[right] = key
quick_sort(data, low, left - 1)
quick_sort(data, left + 1, high)
import random
data = [random.randint(0, 1000) for _ in xrange(500)]
time
在ipython shell中,通过输入命令%time quick_sort(data, 0, 499)
就可以查看调用耗时。
其中time命令的输出wall time是实际耗时的意思,通过简单的耗时查看就可以得出此快排算法针对不均匀分布的数组要慢很多。
timeit
在ipython shell中,通过输入命令%timeit -n 100 -r 5 quick_sort(data, 0, 499)
,就可以很方便的实现多次调用找到最短耗时。
此命令的含义就是重复100遍,每遍调用5此quick_sort,timeit会返回每遍的最短平均耗时。
line_profiler
line_profiler可以分析函数内每一行的执行时间,可以很方便的找出性能瓶颈。line_profiler不是ipython自带工具,需要通过pip install line_profiler
安装。在ipython交互界面,通过下面方式使用:
首先需要通过%load_ext导入line_profiler, -f参数是需要分析的函数。lprun命令的参数可以通过%lprun?
查看。
profile
profile和cProfile是python内置的性能分析工具。可以通过很简单的命令分析每个函数的执行时间。
图中的命令按照累计执行时间进行降序排列,可以较为方便的找出最为耗时的函数。如果想更为直观的展示,还可以安装可视化组件gprof2dot和graphviz,安装方法如下:
pip install gprof2dot
brew install graphviz (for mac)
yum -y install graphviz (for centos)
安装好之后再ipython shell连执行cProfile.run('quick_sort(data, 0, 499)', filename='result.out', sort='cumulative')
命令将耗时分析结果导出只result.out文件中,然后在bash shell里执行命令gprof2dot -f pstats result.out | dot -Tpng -o result.png
即可生成非常直观的调用耗时图。
当然用到的这个例子不是很好,没有把图像的优势展现出来,在调用非常复杂的时候,自上而下,函数的调用关系和耗时情况一目了然。更多的使用可以查阅python官方文档。
yappi
和profile、cProfile类似,但是yappi对于多线程有着更好的支持,profile不会区分多线程,所以结果看起来会很乱。yappi文档连接:https://bitbucket.org/sumerc/yappi/wiki/ApiYappi
使用方法如下:
import yappi
yappi.clear_stats()
yappi.start()
quick_sort(data, 0, 499)
yappi.stop()
stats = yappi.convert2pstats(yappi.get_func_stats())
stats.sort_stats("cumulative")
stats.print_stats()
在python shell连执行这些就可以把要分析的函数按照累计执行时间排序后打印出来,当然yappi同样可以用图像表示,在python shell里执行stats.dump_stats('result.out')
把耗时数据导出到result.out中,然后在bash shell里面执行gprof2dot -f pstats result.out | dot -Tpng -o result.png
,生成图像如下:
当然yappi.start中还可以添加一些参数是否分析多线程以及builtin函数。
如何进行python性能分析?的更多相关文章
-
Python性能分析
Python性能分析 https://www.cnblogs.com/lrysjtu/p/5651816.html https://www.cnblogs.com/cbscan/articles/33 ...
-
python性能分析(一)——使用timeit给你的程序打个表吧
前言 我们可以通过查看程序核心算法的代码,得知核心算法的渐进上界或者下界,从而大概估计出程序在运行时的效率,但是这并不够直观,也不一定十分靠谱(在整体程序中仍有一些不可忽略的运行细节在估计时被忽略了) ...
-
如何进行 Python性能分析,你才能如鱼得水?
[编者按]本文作者为 Bryan Helmig,主要介绍 Python 应用性能分析的三种进阶方案.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 我们应该忽略一些微小的效率提升,几乎在 9 ...
-
Python性能分析工具Profile
Python性能分析工具Profile 代码优化的前提是需要了解性能瓶颈在什么地方,程序运行的主要时间是消耗在哪里,对于比较复杂的代码可以借助一些工具来定位,python 内置了丰富的性能分析工具,如 ...
-
Python性能分析与优化PDF高清完整版免费下载|百度云盘
百度云盘|Python性能分析与优化PDF高清完整版免费下载 提取码:ubjt 内容简介 全面掌握Python代码性能分析和优化方法,消除性能瓶颈,迅速改善程序性能! 对于Python程序员来说,仅仅 ...
-
Python性能分析指南
http://www.admin10000.com/document/2861.html 尽管并非每个你写的Python程序都需要严格的性能分析,但了解一下Python的生态系统中很多优秀的在你需要做 ...
-
Python丨Python 性能分析大全
虽然运行速度慢是 Python 与生俱来的特点,大多数时候我们用 Python 就意味着放弃对性能的追求.但是,就算是用纯 Python 完成同一个任务,老手写出来的代码可能会比菜鸟写的代码块几倍,甚 ...
-
Python性能分析指南(未完成)
英文原文:http://www.huyng.com/posts/python-performance-analysis/ 译文:http://www.oschina.net/translate/pyt ...
-
Python—— 性能分析入门指南
虽然并非你编写的每个 Python 程序都要求一个严格的性能分析,但是让人放心的是,当问题发生的时候,Python 生态圈有各种各样的工具可以处理这类问题. 分析程序的性能可以归结为回答四个基本问题: ...
随机推荐
-
转行IT行业的心路历程
以时间顺序记叙我的这些年 2008/09-2011/07 大学学的机械设计,但是没有全身心的投入学习,大部分时间忙着打零工,赚取生活费学费,因为不想让父母太大负担.在大二时成功申请了提前一年毕业,也就 ...
-
DestroyWindow函数注意事项
最近遇到这样一个问题:将一个窗口句柄以参数的形式传递给一个线程,在线程中使用完之后要将窗口销毁,调用DestroyWindow销毁窗口是返回false,GetLastError的结果为5:拒绝访问,而 ...
-
【转载】C++ IO库
本篇随笔为转载,原贴地址:<C++ Primer>第8章 IO库 学习笔记. 1.IO类 #include <iostream> istream//从流中读取数据 ostrea ...
-
Replication--复制延迟的诊断和解决
要解决复制延迟问题,需要首先定位复制延迟发生点,再找出复制延迟的原因,再做相应处理. 复制延迟发生点:1. 发布服务器2. 分发服务器3. 订阅服务器4. 发布服务器与分发服务器和分发服务器与订阅服务 ...
-
android官方开源的高性能异步加载网络图片的Gridview例子
这个是我在安卓安卓巴士上看到的资料,放到这儿共享下.这个例子android官方提供的,其中讲解了如何异步加载网络图片,以及在gridview中高效率的显示图片此代码很好的解决了加载大量图片时,报OOM ...
-
hibernate常见错误
1.Hibernate: Could not synchronize database state with session 1.主键不是自动生成的,然后自己没手动设置. 2.插入的实体字段跟数据库 ...
-
[改善Java代码]推荐使用String直接量赋值
建议52:推荐使用String直接量赋值 一.建议 String对象的生成方式有两种: 1.通过new关键字生成,String str3 = new String(“中国”); 2.直接声明,如:St ...
-
(C#)Windows Shell 编程系列1 - 基础,浏览一个文件夹
原文 (C#)Windows Shell 编程系列1 - 基础,浏览一个文件夹 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) Windows Shell 编程,即 Windows ...
-
python3+selenium入门07-元素等待
在使用selenium进行操作时,有时候在定位元素时会报错.这可能是因为元素还没有来得及加载导致的.可以等过元素等待,等待元素出现.有强制等待,显式等待,隐式等待. 强制等待 就是之前文章中的time ...
-
idea创建springcloud项目图文教程(EurekaServer注册中心)
http://blog.csdn.net/hcmony/article/details/77854999 idea创建springcloud项目图文教程(EurekaServer注册中心)(六) 1, ...