在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求crc32值的方法
Oct 05 Python
python传递参数方式小结
Apr 17 Python
Python实现的摇骰子猜大小功能小游戏示例
Dec 18 Python
Python实现邮件的批量发送的示例代码
Jan 23 Python
Python线性拟合实现函数与用法示例
Dec 13 Python
Python设计模式之外观模式实例详解
Jan 17 Python
python实现WebSocket服务端过程解析
Oct 18 Python
python常见字符串处理函数与用法汇总
Oct 30 Python
详解python实现可视化的MD5、sha256哈希加密小工具
Sep 14 Python
python中常用的数据结构介绍
Jan 12 Python
python 经纬度求两点距离、三点面积操作
Jun 03 Python
用Python生成会跳舞的美女
Jan 18 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
smarty 原来也不过如此~~呵呵
2006/11/25 PHP
php中截取中文字符串的代码小结
2011/07/17 PHP
PHP大转盘中奖概率算法实例
2014/10/21 PHP
php对xml文件的增删改查操作实现方法分析
2017/05/19 PHP
用htc组件制作windows选项卡
2007/01/13 Javascript
js Html结构转字符串形式显示代码
2011/11/15 Javascript
Javascript核心读书有感之词法结构
2015/02/01 Javascript
深入理解React中es6创建组件this的方法
2016/08/29 Javascript
jquery+ajax实现省市区三级联动效果简单示例
2017/01/04 Javascript
详解使用angular-cli发布i18n多国语言Angular应用
2017/05/20 Javascript
Bootstrap实现可折叠分组侧边导航菜单
2018/03/07 Javascript
微信小程序公用参数与公用方法用法示例
2019/01/09 Javascript
vue treeselect获取当前选中项的label实例
2020/08/31 Javascript
jQuery实现日历效果
2020/09/11 jQuery
解决Python中由于logging模块误用导致的内存泄露
2015/04/23 Python
Python字符串处理之count()方法的使用
2015/05/18 Python
在Python程序中操作文件之isatty()方法的使用教程
2015/05/24 Python
Python自定义线程池实现方法分析
2018/02/07 Python
Python中Numpy ndarray的使用详解
2019/05/24 Python
python绘制随机网络图形示例
2019/11/21 Python
matplotlib绘制多个子图(subplot)的方法
2019/12/03 Python
详解使用python爬取抖音app视频(appium可以操控手机)
2021/01/26 Python
Mio Skincare中文官网:肌肤和身体护理
2016/10/26 全球购物
Sam’s Club山姆会员商店:沃尔玛旗下高端会员制商店
2017/01/16 全球购物
美国新兴城市生活方式零售商:VILLA
2017/12/06 全球购物
教师实习自我鉴定
2013/12/13 职场文书
季度思想汇报
2014/01/01 职场文书
国贸专业个人求职信范文
2014/01/08 职场文书
秋季红领巾广播稿
2014/01/27 职场文书
公司承诺书格式
2014/05/21 职场文书
社区班子对照检查材料
2014/08/27 职场文书
单位法人授权委托书范本
2014/10/09 职场文书
委托书格式范文
2015/01/28 职场文书
小学生红领巾广播稿
2015/08/19 职场文书
800字作文之大雪
2019/12/04 职场文书
MySQL学习总结-基础架构概述
2021/04/05 MySQL