在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目录操作之python遍历文件夹后将结果存储为xml
Jan 27 Python
Python使用稀疏矩阵节省内存实例
Jun 27 Python
python实现的AES双向对称加密解密与用法分析
May 02 Python
Python探索之创建二叉树
Oct 25 Python
django url到views参数传递的实例
Jul 19 Python
用Python从0开始实现一个中文拼音输入法的思路详解
Jul 20 Python
Python一键安装全部依赖包的方法
Aug 12 Python
将pycharm配置为matlab或者spyder的用法说明
Jun 08 Python
在pycharm中关掉ipython console/PyDev操作
Jun 09 Python
一文轻松掌握python语言命名规范规则
Jun 18 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
Sep 04 Python
Python正则表达式中flags参数的实例详解
Apr 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
php入门小知识
2008/03/24 PHP
PHP中查询SQL Server或Sybase时TEXT字段被截断的解决方法
2009/03/10 PHP
php 分页原理详解
2009/08/21 PHP
PHP提示Notice: Undefined variable的解决办法
2012/11/24 PHP
memcache命令启动参数中文解释
2014/01/13 PHP
php实现的支持断点续传的文件下载类
2014/09/23 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
2017/03/31 PHP
php中的异常和错误浅析
2017/05/03 PHP
php生成条形码的图片的实例详解
2017/09/13 PHP
java解析json方法总结
2019/05/16 PHP
用javascript实现的仿Flash广告图片轮换效果
2007/04/24 Javascript
有趣的javascript数组定义方法
2010/09/10 Javascript
基于jquery创建的一个图片、视频缓冲的效果样式插件
2012/08/28 Javascript
JavaScript简单实现鼠标拖动选择功能
2014/03/06 Javascript
js判断iframe内的网页是否滚动到底部触发事件
2014/03/18 Javascript
JS+CSS实现鼠标滑过时动态翻滚的导航条效果
2015/09/24 Javascript
AngularJs Dependency Injection(DI,依赖注入)
2016/09/02 Javascript
JS图片放大效果简单实现代码
2016/09/08 Javascript
js 打开新页面在屏幕中间的实现方法
2016/11/02 Javascript
jQuery extend()详解及简单实例
2017/05/06 jQuery
Vue项目中引入外部文件的方法(css、js、less)
2017/07/24 Javascript
解决vue-router在同一个路由下切换,取不到变化的路由参数问题
2018/09/01 Javascript
代码整洁之道(重构)
2018/10/25 Javascript
vue实现移动端轻量日期组件不依赖第三方库的方法
2019/04/28 Javascript
js实现金山打字通小游戏
2020/07/24 Javascript
JavaScript常用8种数组去重代码实例
2020/09/09 Javascript
图解JS原型和原型链实现原理
2020/09/15 Javascript
使用go和python递归删除.ds store文件的方法
2014/01/22 Python
Python  pip安装lxml出错的问题解决办法
2017/02/10 Python
浅谈Pandas中map, applymap and apply的区别
2018/04/10 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
2019/06/14 Python
一款纯css3实现的鼠标悬停动画按钮
2014/12/29 HTML / CSS
GEOX鞋美国官方网站:意大利会呼吸的鞋
2017/07/12 全球购物
舞蹈教师自荐信
2014/01/27 职场文书
村主任“四风”问题个人整改措施
2014/10/04 职场文书
员工手册董事长致辞
2015/07/29 职场文书