在分析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性能分析?的更多相关文章

  1. Python性能分析

    Python性能分析 https://www.cnblogs.com/lrysjtu/p/5651816.html https://www.cnblogs.com/cbscan/articles/33 ...

  2. python性能分析(一)——使用timeit给你的程序打个表吧

    前言 我们可以通过查看程序核心算法的代码,得知核心算法的渐进上界或者下界,从而大概估计出程序在运行时的效率,但是这并不够直观,也不一定十分靠谱(在整体程序中仍有一些不可忽略的运行细节在估计时被忽略了) ...

  3. 如何进行 Python性能分析,你才能如鱼得水?

    [编者按]本文作者为 Bryan Helmig,主要介绍 Python 应用性能分析的三种进阶方案.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 我们应该忽略一些微小的效率提升,几乎在 9 ...

  4. Python性能分析工具Profile

    Python性能分析工具Profile 代码优化的前提是需要了解性能瓶颈在什么地方,程序运行的主要时间是消耗在哪里,对于比较复杂的代码可以借助一些工具来定位,python 内置了丰富的性能分析工具,如 ...

  5. Python性能分析与优化PDF高清完整版免费下载|百度云盘

    百度云盘|Python性能分析与优化PDF高清完整版免费下载 提取码:ubjt 内容简介 全面掌握Python代码性能分析和优化方法,消除性能瓶颈,迅速改善程序性能! 对于Python程序员来说,仅仅 ...

  6. Python性能分析指南

    http://www.admin10000.com/document/2861.html 尽管并非每个你写的Python程序都需要严格的性能分析,但了解一下Python的生态系统中很多优秀的在你需要做 ...

  7. Python丨Python 性能分析大全

    虽然运行速度慢是 Python 与生俱来的特点,大多数时候我们用 Python 就意味着放弃对性能的追求.但是,就算是用纯 Python 完成同一个任务,老手写出来的代码可能会比菜鸟写的代码块几倍,甚 ...

  8. Python性能分析指南(未完成)

    英文原文:http://www.huyng.com/posts/python-performance-analysis/ 译文:http://www.oschina.net/translate/pyt ...

  9. Python—— 性能分析入门指南

    虽然并非你编写的每个 Python 程序都要求一个严格的性能分析,但是让人放心的是,当问题发生的时候,Python 生态圈有各种各样的工具可以处理这类问题. 分析程序的性能可以归结为回答四个基本问题: ...

随机推荐

  1. nohup程序后台执行

    Linux常用命令,用于不挂断的执行程序. nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令.该命令可以在你退出帐户/关闭终端之后继续运行相应 ...

  2. 使用 JavaScriptService 在.NET Core 里实现DES加密算法

    文章<ASP.NET Core love JavaScript>和<跨平台的 NodeJS 组件解决 .NetCore 不支持 System.Drawing图形功能的若干问题> ...

  3. 我是如何在SQLServer中处理每天四亿三千万记录的

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

  4. Linux CentOS 配置Tomcat环境

    一.下载Tomcat 下载Tomcat方式也有两种,可以参考我的前一篇博文Linux CentOS配置JDK环境,这边就不再赘述. 二.在Linux处理Tomcat包 1.创建tomcat文件夹 mk ...

  5. 学习ASP.NET Core, 怎能不了解请求处理管道[4]: 应用的入口——Startup

    一个ASP.NET Core应用被启动之后就具有了针对请求的处理能力,而这个能力是由管道赋予的,所以应用的启动同时意味着管道的成功构建.由于管道是由注册的服务器和若干中间件构成的,所以应用启动过程中一 ...

  6. [译] C# 5.0 中的 Async 和 Await (整理中...)

    C# 5.0 中的 Async 和 Await [博主]反骨仔 [本文]http://www.cnblogs.com/liqingwen/p/6069062.html 伴随着 .NET 4.5 和 V ...

  7. ubuntu如何安装nodejs最新版 本

    如何正确的安装nodejs? 我们可以先安装nvm, git clone https://github.com/creationix/nvm.git ~/.nvm 然后打开 ~/.bashrc ,   ...

  8. thinkphp数据的查询和截取

    public function NewsList(){ $this->assign('title','news'); $p = I('page',1); $listRows = 6; $News ...

  9. IT持续集成之质量管理

    研发工具生态 质量相关工作 一次编译产出测试包与上线包 !从源头保证版本的⼀一致性!代码质量控制! 全⽅方位的⾃自动化测试体系保证! 提测冒烟效率! 全⾃自动上线流程杜绝⼈人⼯工犯错! 生产环境应⽤用 ...

  10. Android之ContentProvider数据存储

    一.ContentProvider保存数据介绍 一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据完全暴露出去,而且ContentProvider是以类似数据库中表的方式将数 ...