在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的一些用法分享
Oct 07 Python
深度定制Python的Flask框架开发环境的一些技巧总结
Jul 12 Python
Python标准库inspect的具体使用方法
Dec 06 Python
Python实现类似比特币的加密货币区块链的创建与交易实例
Mar 20 Python
Django 实现购物车功能的示例代码
Oct 08 Python
python模拟鼠标点击和键盘输入的操作
Aug 04 Python
python matplotlib库直方图绘制详解
Aug 10 Python
python fuzzywuzzy模块模糊字符串匹配详细用法
Aug 29 Python
python基于opencv实现人脸识别
Jan 04 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
Jan 06 Python
Python中Qslider控件实操详解
Feb 20 Python
Django drf请求模块源码解析
Jun 08 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文件的实现方法
2007/03/19 PHP
使用Xdebug调试和优化PHP程序之[1]
2007/04/17 PHP
Laravel中使用FormRequest进行表单验证方法及问题汇总
2016/06/19 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
thinkphp整合系列之极验滑动验证码geetest功能
2019/06/18 PHP
IE php关于强制下载文件的代码
2008/08/23 Javascript
对xmlHttp对象方法和属性的理解
2011/01/17 Javascript
jQuery右键菜单contextMenu使用实例
2011/09/28 Javascript
jQuery学习笔记 操作jQuery对象 文档处理
2012/09/19 Javascript
jQuery之折叠面板的深入解析
2013/06/19 Javascript
js Map List 遍历使用示例
2013/07/10 Javascript
Javascript中对象继承的实现小例
2014/05/12 Javascript
JavaScript中消除闭包的一般方法介绍
2015/03/16 Javascript
JavaScript中setter和getter方法介绍
2016/07/11 Javascript
原生JS实现圣旨卷轴展开效果
2017/03/06 Javascript
react.js使用webpack搭配环境的入门教程
2017/08/14 Javascript
vue绑定设置属性的多种方式(5)
2017/08/16 Javascript
jQuery+CSS实现的table表格行列转置功能示例
2018/01/08 jQuery
layui从数据库中获取复选框的值并默认选中方法
2018/08/15 Javascript
JS使用setInterval计时器实现挑战10秒
2020/11/08 Javascript
[00:43]DOTA2小紫本全民票选福利PA至宝全方位展示
2014/11/25 DOTA
python调用百度REST API实现语音识别
2018/08/30 Python
pycharm中成功运行图片的配置教程
2018/10/28 Python
Python socket实现多对多全双工通信的方法
2019/02/13 Python
在Django admin中编辑ManyToManyField的实现方法
2019/08/09 Python
修改 CentOS 6.x 上默认Python的方法
2019/09/06 Python
不可轻视HTML5!App三年内将被html5顶替彻底消失
2015/11/18 HTML / CSS
微软新西兰官方网站:Microsoft New Zealand
2018/08/17 全球购物
2013年军训通讯稿
2014/02/05 职场文书
城市规划应届生推荐信
2014/09/08 职场文书
群众路线调研报告范文
2014/11/03 职场文书
领导欢迎词致辞
2015/01/23 职场文书
Pytorch distributed 多卡并行载入模型操作
2021/06/05 Python
Python面向对象之成员相关知识总结
2021/06/24 Python
Python re.sub 反向引用的实现
2021/07/07 Python
TS 类型兼容教程示例详解
2022/09/23 Javascript