在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中执行shell命令的几个方法小结
Sep 18 Python
Python中easy_install 和 pip 的安装及使用
Jun 05 Python
Python3使用PyQt5制作简单的画板/手写板实例
Oct 19 Python
使用Python和xlwt向Excel文件中写入中文的实例
Apr 21 Python
python 实现将字典dict、列表list中的中文正常显示方法
Jul 06 Python
Python Flask 搭建微信小程序后台详解
May 06 Python
Python自定义函数计算给定日期是该年第几天的方法示例
May 30 Python
python实现BP神经网络回归预测模型
Aug 09 Python
numpy.random.shuffle打乱顺序函数的实现
Sep 10 Python
Python如何优雅获取本机IP方法
Nov 10 Python
浅析python表达式4+0.5值的数据类型
Feb 26 Python
基于Python脚本实现邮件报警功能
May 20 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中的时间处理
2006/10/09 PHP
smarty高级特性之过滤器的使用方法
2015/12/25 PHP
apache php mysql开发环境安装教程
2016/07/28 PHP
ThinkPHP中调用PHPExcel的实现代码
2017/04/08 PHP
Ucren Virtual Desktop V2.0
2006/11/07 Javascript
JS去除数组重复值的五种不同方法
2013/09/06 Javascript
javascript窗口宽高,鼠标位置,滚动高度(详细解析)
2013/11/18 Javascript
JQuery与JS里submit()的区别示例介绍
2014/02/17 Javascript
一个网页标题title的闪动提示效果实现思路
2014/03/22 Javascript
jquery选择器需要注意的问题
2014/11/26 Javascript
JavaScript中的console.assert()函数介绍
2014/12/29 Javascript
js实现网页抽奖实例
2015/08/05 Javascript
原生js实现图片层叠轮播切换效果
2016/02/02 Javascript
JS本地刷新返回上一页代码
2016/07/25 Javascript
Js操作DOM元素及获取浏览器高宽的简单方法
2016/09/08 Javascript
javascript数组常用方法汇总
2016/09/10 Javascript
nodejs调取微信收货地址的方法
2017/12/20 NodeJs
vue项目中使用vue-i18n报错的解决方法
2019/01/13 Javascript
JS常见错误(Error)及处理方案详解
2020/07/02 Javascript
vue循环中点击选中再点击取消(单选)的实现
2020/09/10 Javascript
python3利用tcp实现文件夹远程传输
2018/07/28 Python
浅谈python常用程序算法
2019/03/22 Python
解决Tensorboard 不显示计算图graph的问题
2020/02/15 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
2020/03/10 Python
Python类super()及私有属性原理解析
2020/06/15 Python
Selenium webdriver添加cookie实现过程详解
2020/08/12 Python
Python调用高德API实现批量地址转经纬度并写入表格的功能
2021/01/12 Python
python Protobuf定义消息类型知识点讲解
2021/03/02 Python
Antonioli美国在线商店:时尚前卫奢华
2019/07/29 全球购物
写一个用矩形法求定积分的通用函数
2012/11/08 面试题
稽核岗位职责
2015/02/10 职场文书
中标通知书格式
2015/04/17 职场文书
2015年“7.11”世界人口日宣传活动方案
2015/05/06 职场文书
公司考勤管理制度
2015/08/04 职场文书
默认网关不可用修复后过一会又不好使了解决方法
2022/04/08 数码科技
httpclient调用远程接口的方法
2022/08/14 Java/Android