在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读取Android permission文件
Nov 01 Python
Python实现统计英文单词个数及字符串分割代码
May 28 Python
Python的Django框架下管理站点的基本方法
Jul 17 Python
用tensorflow实现弹性网络回归算法
Jan 09 Python
用 Python 连接 MySQL 的几种方式详解
Apr 04 Python
解读python如何实现决策树算法
Oct 11 Python
对python中基于tcp协议的通信(数据传输)实例讲解
Jul 22 Python
Python操作远程服务器 paramiko模块详细介绍
Aug 07 Python
如何在Cloud Studio上执行Python代码?
Aug 09 Python
python实现大量图片重命名
Mar 23 Python
解决Pytorch训练过程中loss不下降的问题
Jan 02 Python
Jupyter notebook 不自动弹出网页的解决方案
May 21 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
PHP sprintf() 函数的应用(定义和用法)
2012/06/29 PHP
PHP合并两个数组的两种方式的异同
2012/09/14 PHP
百度实时推送api接口应用示例
2014/10/21 PHP
thinkphp实现上一篇与下一篇的方法
2014/12/08 PHP
深入浅析PHP无限极分类的案例教程
2016/05/09 PHP
不用AJAX和IFRAME,说说真正意义上的ASP+JS无刷新技术
2008/09/25 Javascript
一个可以兼容IE FF的加为首页与加入收藏实现代码
2009/11/02 Javascript
JQuery选择器特辑 详细小结
2012/05/14 Javascript
Jquery弹出层插件ThickBox的使用方法
2014/12/09 Javascript
手机开发必备技巧:javascript及CSS功能代码分享
2015/05/25 Javascript
仅一个form表单 js实现注册信息依次填写提交功能
2016/06/12 Javascript
使用Angular.js实现简单的购物车功能
2016/11/21 Javascript
详解nodejs 文本操作模块-fs模块(二)
2016/12/22 NodeJs
jquery将标签元素的高设为屏幕的百分比
2017/04/19 jQuery
swiper自定义分页器使用方法详解
2020/09/14 Javascript
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
2019/05/08 Javascript
vue+elementui 对话框取消 表单验证重置示例
2019/10/29 Javascript
JS实现网页端猜数字小游戏
2020/03/06 Javascript
[03:36]2015国际邀请赛第二日现场精彩集锦
2015/08/06 DOTA
用Python进行基础的函数式编程的教程
2015/03/31 Python
Python3使用requests登录人人影视网站的方法
2016/05/11 Python
python rsa 加密解密
2017/03/20 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
2020/03/23 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
2020/06/04 Python
解决Alexnet训练模型在每个epoch中准确率和loss都会一升一降问题
2020/06/17 Python
Pycharm自带Git实现版本管理的方法步骤
2020/09/18 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
2020/11/05 Python
html5 Canvas画图教程(8)—canvas里画曲线之bezierCurveTo方法
2013/01/09 HTML / CSS
农民入党思想汇报
2014/01/03 职场文书
自我评价如何写好?
2014/01/05 职场文书
国际商务专业职业生涯规划书范文
2014/01/17 职场文书
小学毕业感言50字
2014/02/16 职场文书
党的群众路线教育实践活动批评与自我批评范文
2014/10/16 职场文书
vue.js Router中嵌套路由的实用示例
2021/06/27 Vue.js
Java字符缓冲流BufferedWriter
2022/04/09 Java/Android
vue3 自定义图片放大器效果的示例代码
2022/07/23 Vue.js