python输出程序运行时间_叨叨 Python 性能优化工具

虽然Python是一个”慢慢的“语言,但是不代表我们对性能没有任何的追求,在程序运行过程中,如果发现程序运行时间太长或者内存占用过大,免不了需要对程序的执行过程进行一些监测,找到有问题的地方,进行优化。今天来分享一些平时用到的Python性能分析工具

memory_profiler

memory_profiler是监控python进程的神器,只需要在函数加一个装饰器就可以输出每行代码的内存使用情况

安装:

pip install memory_profiler

使用:

import time@profiledef my_func():    a = [1] * (10 ** 6)    b = [2] * (2 * 10 ** 7)    time.sleep(10)    del b    del a    print "+++++++++"if __name__ == '__main__':    my_func()

输出:

$ python -m memory_profiler del3.py+++++++++Filename: del3.pyLine #    Mem usage    Increment   Line Contents================================================  10.293 MiB    0.000 MiB   @profile                            def my_func():  17.934 MiB    7.641 MiB       a = [1] * (10 ** 6) 170.523 MiB  152.590 MiB       b = [2] * (2 * 10 ** 7) 170.527 MiB    0.004 MiB       time.sleep(10)  17.938 MiB -152.590 MiB       del b  10.305 MiB   -7.633 MiB       del a  10.309 MiB    0.004 MiB       print "+++++++++"

内建函数 timeit

import timeitimport timedef my_func():    time.sleep(1)    return sum([1,2,3])result = timeit.timeit(my_func, number=5)print(result)

Jupyter Notebook Magic 命令

在Jupyter Notebook中,可以通过%%timeit魔法命令测试cell中代码的运行时间

%%timeitimport timedef my_func():    time.sleep(1)    return sum([1,2,3])result = timeit.timeit(my_func, number=5)print(result)

计时装饰器

Python 中的装饰器可以在其他函数不需要改动任何代码的情况下增加额外功能,经常用在,插入日志、性能测试、权限校验等场景中。我们可以将计时功能封装成一个装饰器,方便复用。

from functools import wrapsimport timedef timeit(func):    @wraps(func)    def deco():        start = time.time()        res = func()        end = time.time()        delta = end - start        print("Wall time ", delta)        return res    return deco

使用:

@timeitdef my_func():    # do something    time.sleep(3)    pass

输出:

Wall time: 3

line_profiler

如果我们除了想知道代码整体的运行时间之外,还要精确分析每行代码的运行时间,那python的 line_profiler 模块就可以帮到你啦!line_profiler 可以用来测试函数每行代码的响应时间等情况。为了使用方便,可以将line_profiler 相关函数封装在装饰器中进行使用,这样在接口请求时,则会执行此装饰器并打印出结果。

安装:

pip install line_profiler

使用:

from flask import Flask, jsonifyimport timefrom functools import wrapsfrom line_profiler import LineProfiler# 查询接口中每行代码执行的时间def func_line_time(f):    @wraps(f)    def decorator(*args, **kwargs):        func_return = f(*args, **kwargs)        lp = LineProfiler()        lp_wrap = lp(f)        lp_wrap(*args, **kwargs)         lp.print_stats()         return func_return     return decoratorapp = Flask(__name__)@app.route('/line_test') @func_line_time def line_test():     for item in range(5):         time.sleep(1)     for item in xrange(5):         time.sleep(0.5)     return jsonify({'code':200})  if __name__=='__main__': app.run()

输出:

* Running on http://127.0.0.1:5000/Timer unit: 1e-06 sTotal time: 7.50827 sFile: /home/rgc/baidu_eye/carrier/test/flask_line_profiler_test.pyFunction: line_test at line 22Line #      Hits         Time  Per Hit   % Time  Line Contents==============================================================                                          @app.route('/line_test')                                          @func_line_time                                          def line_test():        6         33.0      5.5      0.0      for item in range(5):        5    5005225.0 1001045.0     66.7          time.sleep(1)        6         31.0      5.2      0.0      for item in xrange(5):        5    2502696.0 500539.2     33.3          time.sleep(0.5)        1        282.0    282.0      0.0      return jsonify({'code':200})127.0.0.1 - - [05/Mar/2018 15:58:21] "GET /line_test HTTP/1.1" 200 -

pyheat

相较于上面的代码运行时间测试工具,pyheat 通过matplotlib 的绘制热力图来展现代码的运行时间,显得更为直观

539b8c66c8e7a27217b753ea3300c710.png安装:

pip install py-heat

使用方法:

pyheat  --out image_file.png

heartrate

heartrate 也是一个可视化的监测工具,可以像监测心率一样追踪程序运行,通过web页面可视化Python程序的执行过程。

a6d8e54ae50a24f8bf19990b1fe1e35b.gif
img

左侧数字表示每行代码被触发的次数。长方框表示最近被触发的代码行——方框越长表示触发次数越多,颜色越浅表示最近被触发次数越多。该工具记录的是每行代码执行的次数,

而不是具体执行时间,在性能调试的时候有些鸡肋

安装:

pip install --user heartrate

使用:

import heartratefrom heartrate import trace, filesheartrate.trace(browser=True)trace(files=files.path_contains('my_app', 'my_library'))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467643.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

链接学习之obj文件探索

Windows的gcc环境,往官网http://sourceforge.net/project/showfiles.php?group_id2435 下载MinGW,安装,安装完毕后按照包 配置环境变量 a.在PATH的值中加入"C:\Program Files\MinGWStudio\MinGW\bin"。这是寻找gcc编译器的路径。…

http 请求默认时间_JMeter接口测试之HTTP请求默认值

不管是在UI级别的自动化测试还是在接口级别的自动化测试中,对公共数据数据的分离都是一种趋势,或者某种程度来说,这是自动化测试中必须要掌握的一种能力,是基本技能。这些公共数据就包含了测试地址,以及登录的账号密码…

有意思的select~

前言最近在写一个小程序,也就是简单的系统调用,但是神奇的是,我用的这个系统调用刚好就阻塞了。如果你也写过应用程序,肯定也会遇到过这样的问题。后来,发现了select这个好东西,可以用来监听文件描述。sele…

cesium 页面截图_Cesium开发入门篇 | 02开发环境搭建及第一个示例

开发环境准备利用Cesium API进行二次开发属于Web前端开发范畴,目前比较火的Web三剑客包括React、Vue、AngularJS,每个js库的详细介绍可转至官网查看,在此不做详细介绍。本次开发环境是基于Vue搭建的,需要安装(部署)的软件主要包括…

一个单片机ADC的挖坑填坑之旅

[导读] 本文来解析一个盆友在使用STM32采集电池电压踩过的坑。以STM32F4 的ADC属于逐次逼近SAR 型ADC为例进行分析,参考STM32F405xx Datasheet,对于如何编写ADC程序就不做描述了。先描述一下坑 采集电池电压,利用两个电阻将电池电压分压&…

of_property_read_string 剖析~

前言今天在一个群里面看到的一个朋友提交,说of_property_read_string 这个函数有两个定义,到底是用了哪个呢?所以这篇文章就说下这个函数。函数引用的头文件引用的头文件位置在\kernel-4.4\include\linux\of.h其中一个是extern int of_proper…

CPU频率和核心

设置CPU的核心数在/sys/devices/system/cpu目录下可以看到你的CPU有几个核心,如果是四核,就是cpu0,cpu1,cpu2,cpu3 4个文件夹。cpu0 常开。进一个其他文件夹,比如cpu1,里面有个online文件用cat命令查看该文…

关于“进程”与“线程”的最通俗解析

来源:电子工程专辑进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。最近,我读到一篇材料,发现有一个很好的类比,可以把它们解…

要想选到音质好的耳机,你应该需要知道这些~

最近在一个音频公司调试我们设备的音频,从这次调试中,有所收获,希望这次的吹牛大家看完后,以后去买音频产品,可以分辨什么是好的,什么是不好的。有些产品硬件没有问题,但是产品经理因为个人喜好…

Fantasia (Tarjan+树形DP)

Time Limit: 1000 ms Memory Limit: 256 MB Description 给定一张N个点、M条边的无向图 $G$ 。每个点有个权值Wi。 我们定义 $G_i$ 为图 $G$ 中删除第 $i$ 号顶点后的图。我们想计算 $G_1, G_2, ..., G_n$ 这N张图的权值。 对于任意一张图 $G$ ,它的权值是这样定义…

买书这件事

知识这种东西,你只有不断的补充才不会觉得匮乏,我每年都会买点书,我喜欢买书,但是却不看书,很多书籍我都是当成工具书来用。我记得在2015年的时候,我需要自己写专利,但是我对写专利这个事情一窍…

Linus Torvalds的最新电脑配置

大家好,祝大家6.1节日快乐最近Linus Torvalds 公布了他的电脑配置,有了这个配置清单之后,每个人都可以拥有一台和Linux之父一样的电脑,当你拥有了一台之后,你可以发个朋友圈,「我今天用Linus 的电脑解了一个…

马上就校招了,是要去实习还是复习?

昨天晚上,遇到一个特别纠结的同学,他现在收到一份实习的通知,他犹豫是要去实习呢还是继续在学校复习学习技术。实习的话可以增加自己校招的筹码,比如在和面试官侃大山的时候,可以把实习这件事情拿出来说,这…

嵌入式杂谈之makefile补充

我看了下自己的文章库存,好像还没有一篇关于Makefile的文章,所以这篇刚好可以弥补自己的缺失。makefile预定义变量预定义变量即系统自带的变量预定义变量作用AR库文件维护程序的名称,默认为arAS汇编程序的名称,默认为asCCc编译器的…

安卓9.0马达框架分析

前言最近需要将之前的一些驱动接口转为安卓标准接口,方便上层应用或者第三方应用去适配。这篇文章先从简单的马达框架入手进行讲解。正文整个马达框架比较简单,安卓官方已经帮我们实现了framework到HAL层,我们需要实现的就只有驱动层。这篇文…

PYQT4 Python GUI 编写与 打包.exe程序

工作中需要开发一个小工具,简单的UI界面可以很好的提高工具的实用性,由此开启了我的第一次GUI开发之旅,下面将自己学习的心得记录一下,也做为学习笔记吧!!! 参考:http://www.qaulau.…

你知道嵌入式,那你看过这个吗?

大家好,因为最近各种原因,我身边的很多同事都转行摆地摊了,可能因为那是一份自由的职业,摆地摊可以从事的范围很广,也不用起早贪黑了,而且收入并不低。也是因为这样,很多嵌入式方面的岗位越来越…

mvc一对多模型表单的快速构建

功能需求描述 Q:在实际的开发中,经常会遇到一个模型中包含有多个条目的表单。如何将数据提交到后台? A: 以数组的形式提交到后台就Ok了(真的那么简单么,如果再嵌套一层呢?) A2:拆分多个模型,映射就没啥问题…

c语言中 if(x) 、if(0) 、if(1)

解释if 语句里面包含真和非真&#xff0c;但是如果我们没有写清楚真和非真的话&#xff0c;会如何呢&#xff1f;if(x)相当于if(x ! 0)如果是指针的话&#xff0c;相当于if(x ! NULL)而if(1)相当于if(1 ! 0)还有if(0)相当于if(0 ! 0)举个例子#include<stdio.h> int main(…

看Linus骂人,真解气

感受下Linus骂人的感觉吧&#xff0c; 这样你会觉得工作中遇到的那些不愉快就算个鸟事背景一个Linux主线的内核维护者提交了一份patch&#xff0c;并说明问题产生的原因是因为应用传的音频有问题。Linus回复如下你他娘的给老子闭嘴&#xff01;这是一个内核bug好不好&#xff0…