在IPython中进行Python程序执行时间的测量方法


Posted in Python onNovember 01, 2018

在写MATLAB的脚本的时候我时长会用tic、toc进行一下程序运行时间的测量。在Python中偶尔也会测试下,但是基本上都是靠使用time模块。接触了IPython之后突然间发现,原来程序执行时间的测试可以如此简单!

在IPython中,程序执行时间的测试是通过魔术函数来实现。这个功能的魔术函数有两个,一个是time,还有一个是timeit。后面这个功能与前面的功能类似,但是更为精确,因为测试采用了多次测试求取平均值的方式实现。

之前写了一个简单的测试小脚本,

#!/usr/bin/python
 
import numpy as np
from numpy.randomimport randn
 
data = {i :randn() for i in range(7)}

print(data)代码如下:

在IPython中测试记录如下:

In [21]: %time%run dict.py
{0:1.1356172702418055, 1: -0.24725099335195655, 2: -0.8566028472732841, 3:-0.7027863981377108, 4: 0.8563383373116604, 5: 1.4790260114125025, 6:0.45741003038960254}
Wall time: 0 ns
 
In [22]: %time%run dict.py
{0:0.4634308244997993, 1: -0.2169481701227914, 2: 1.844213869777202, 3:-1.09428552819743, 4: -0.3162553722440559, 5: 0.35052990092285824, 6:-1.0779260478165211}
Wall time: 0 ns

这结果有点……

确实,这么简单的语句能够执行多少时间呢!何况现在用的本子还是标压处理器,又是I7计算最强芯。好,接下来改造一下,改成循环:

#!/usr/bin/python
 
import numpy as np
from numpy.randomimport randn
 
for i inrange(1000):
data = {i : randn() for i in range(7)}
print(data)

以上代码存储到新文件之后,在IPython中进行测试与记录。眼前闪过一大片输出,拷贝全部的记录不太可能了,截取部分结果如下:

{0:-0.8346562430694008, 1: -0.5081226699243429, 2: 0.14690620427134915, 3:-1.1947018796604227, 4: 0.5299884594565932, 5: -0.11730239691529774, 6:-0.008304349615949396}
{0:-0.5004558540946741, 1: -2.239882398599743, 2: -0.4877611466394901, 3:0.04679029941320335, 4: -0.04061984884439187, 5: -0.18026780798066566, 6:0.2617579789690715}
{0:-0.8498496249579838, 1: -0.34650772255315343, 2: -0.7067822075542513, 3:0.4675343777714329, 4: -2.095049716609193, 5: -1.9396619017424426, 6:1.4723754138476228}
{0:1.0829454562962688, 1: 0.3658593642766029, 2: 0.7825005873884392, 3:-0.7024245957641886, 4: -0.9083494908408439, 5: -0.5225361343604294, 6:0.2780526056846729}
Wall time: 2.67 s

这次的执行结果确实是挺长的,个人觉得主要的瓶颈应该还是在输出功能上吧!在用timeit测试一下,看看结果是否有大的变化。部分记录结果如下:

{0:1.1881922773474327, 1: 2.095703415950821, 2: 0.7768251617416795, 3:-0.3639801567794642, 4: -1.2155069020886828, 5: 0.05454831526380187, 6:0.521994301720664}
{0:0.0962573073179745, 1: -0.6917641905037167, 2: 1.021197433972855, 3:0.4155701479521505, 4: 2.393391538898768, 5: 1.3755258048747323, 6:-0.5540780961303758}
{0:-0.418199398478115, 1: 1.1973929026808094, 2: -0.3243683593668846, 3:-1.7765735471011064, 4: -1.1567528174241677, 5: -2.297151750515544, 6:1.6966820033283279}
1 loop, best of 3:1.68 s per loop

从上面的结果中可以看出,似乎这个结果也不是取均值(我看的教程中写的是取均值)。上面的结果提示中,测试进行了三次,而从三次中取出了一个最好的结果。跟之前的结果确实是有一定的差距。我再修改一下代码,把print改掉,看看是否print是一个时间消耗大户!代码如下:

#!/usr/bin/python
 
import numpy as np
from numpy.randomimport randn
 
for i inrange(1000):
data = {i : randn() for i in range(7)}
a = data

两种测试的结果分别如下:

Time测试:

In [28]: %time%run dict_loop_no_disp.py
Wall time: 15 ms
In [29]: %timeit%run dict_loop_no_disp.py
100 loops, best of3: 3.2 ms per loop

从上面的结果可看出,print确实是一个时间消耗大户!而从这组结果中,似乎有觉得我对timeit的输出理解有点偏了。直观上的理解,上次的测试似乎只有1次循环测试,但是得出了三个最好的成绩。而这次的测试进行了100个循环,得出了三个最好的成绩?是这样理解吗?

如何理解暂且不去深究了,总体说来是后面一种精确一点罢了!实际的使用中,用的时候大约还是不多,毕竟我的Python程序执行时间都少的几乎可以忽略。

以上这篇在IPython中进行Python程序执行时间的测量方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
May 06 Python
wxPython中文教程入门实例
Jun 09 Python
Python实现快速排序和插入排序算法及自定义排序的示例
Feb 16 Python
Pycharm学习教程(4) Python解释器的相关配置
May 03 Python
Python获取本机所有网卡ip,掩码和广播地址实例代码
Jan 22 Python
Python交互环境下实现输入代码
Jun 22 Python
python 移动图片到另外一个文件夹的实例
Jan 10 Python
程序员的七夕用30行代码让Python化身表白神器
Aug 07 Python
Python操作Sonqube API获取检测结果并打印过程解析
Nov 27 Python
完美解决python针对hdfs上传和下载的问题
Jun 05 Python
Python学习之路之pycharm的第一个项目搭建过程
Jun 18 Python
基于python实现音乐播放器代码实例
Jul 01 Python
Python找出微信上删除你好友的人脚本写法
Nov 01 #Python
[原创]Python入门教程4. 元组基本操作
Oct 31 #Python
对numpy中数组转置的求解以及向量内积计算方法
Oct 31 #Python
Ubuntu下Python2与Python3的共存问题
Oct 31 #Python
对numpy中向量式三目运算符详解
Oct 31 #Python
对numpy中的where方法嵌套使用详解
Oct 31 #Python
在Python中使用defaultdict初始化字典以及应用方法
Oct 31 #Python
You might like
sqlyog 中文乱码问题的设置方法
2008/10/19 PHP
深入探讨:Nginx 502 Bad Gateway错误的解决方法
2013/06/03 PHP
phpmailer发送邮件之后,返回收件人是否阅读了邮件的方法
2014/07/19 PHP
php array_merge函数使用需要注意的一个问题
2015/03/30 PHP
PHP模板引擎Smarty中的保留变量用法分析
2016/04/11 PHP
TP框架实现上传一张图片和批量上传图片的方法分析
2020/04/23 PHP
JavaScript实现禁止后退的方法
2006/12/27 Javascript
IE/FireFox具备兼容性的拖动代码
2007/08/13 Javascript
javascript模拟select,jselect的方法实现
2012/11/08 Javascript
Javascript数组操作函数总结
2015/02/05 Javascript
JavaScript 动态加载脚本和样式的方法
2015/04/13 Javascript
JavaScript处理解析JSON数据过程详解
2015/09/11 Javascript
JavaScript设计模式经典之工厂模式
2016/02/24 Javascript
jQuery实现只允许输入数字和小数点的方法
2016/03/02 Javascript
js实现目录链接,内容跟着目录滚动显示的简单实例
2016/10/15 Javascript
详解JS: reduce方法实现 webpack多文件入口
2017/02/14 Javascript
原生JS实现旋转轮播图+文字内容切换效果【附源码】
2018/09/29 Javascript
javascript实现抢购倒计时程序
2019/08/26 Javascript
[51:53]完美世界DOTA2联赛决赛日 Inki vs LBZS 第二场 11.08
2020/11/10 DOTA
[59:30]完美世界DOTA2联赛PWL S3 access vs LBZS 第二场 12.20
2020/12/23 DOTA
wxPython 入门教程
2008/10/07 Python
在Python中使用AOP实现Redis缓存示例
2017/07/11 Python
pycharm+django创建一个搜索网页实例代码
2018/01/24 Python
Python装饰器简单用法实例小结
2018/12/03 Python
用pip给python安装matplotlib库的详细教程
2021/02/24 Python
全球领先的各类汽车配件零售商:Advance Auto Parts
2016/08/26 全球购物
数以千计的折扣工业产品:ESE Direct
2018/05/20 全球购物
英国羊绒服装购物网站:Pure Collection
2018/10/22 全球购物
迪士尼西班牙官方网上商店:ShopDisney西班牙
2020/02/02 全球购物
关于Java String的一道面试题
2013/09/29 面试题
用你熟悉的语言写一个连接ORACLE数据库的程序,能够完成修改和查询工作
2012/06/11 面试题
餐饮管理自我介绍信
2014/01/15 职场文书
40岁生日感言
2014/02/15 职场文书
2014最新党员批评与自我批评材料
2014/09/24 职场文书
土地转让协议书
2014/09/27 职场文书
学生检讨书如何写
2014/10/30 职场文书