在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函数帮助查询小工具
Mar 13 Python
浅析Python中的多进程与多线程的使用
Apr 07 Python
浅析Python中的多条件排序实现
Jun 07 Python
Python中asyncore异步模块的用法及实现httpclient的实例
Jun 28 Python
Python爬虫的两套解析方法和四种爬虫实现过程
Jul 20 Python
Python 迭代,for...in遍历,迭代原理与应用示例
Oct 12 Python
Python爬虫使用代理IP的实现
Oct 27 Python
python数据处理——对pandas进行数据变频或插值实例
Apr 22 Python
通过Python pyecharts输出保存图片代码实例
Nov 25 Python
python 日志模块logging的使用场景及示例
Jan 04 Python
Python中常见的反爬机制及其破解方法总结
Jun 10 Python
Python使用BeautifulSoup4修改网页内容
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数组函数序列之array_splice() - 在数组任意位置插入元素
2011/11/07 PHP
一个完整的PHP类包含的七种语法说明
2015/06/04 PHP
8个PHP数组面试题
2015/06/23 PHP
CodeIgniter视图使用注意事项
2016/01/20 PHP
Thinkphp框架开发移动端接口(2)
2016/08/18 PHP
有关DOM元素与事件的3个谜题
2010/11/11 Javascript
JQuery EasyUI 数字格式化处理示例
2014/05/05 Javascript
JavaScript函数获取事件源的小例子
2014/05/14 Javascript
jquery实现一个简单好用的弹出框
2014/09/26 Javascript
Jquery中find与each方法用法实例
2015/02/04 Javascript
jQuery使用$.get()方法从服务器文件载入数据实例
2015/03/25 Javascript
javascript实现可全选、反选及删除表格的方法
2015/05/15 Javascript
jQuery随手笔记之常用的jQuery操作DOM事件
2015/11/29 Javascript
SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
2015/12/10 Javascript
JS排序之快速排序详解
2017/04/08 Javascript
关于vue-router的beforeEach无限循环的问题解决
2017/09/09 Javascript
微信小程序支付前端源码
2018/08/29 Javascript
在Vue methods中调用filters里的过滤器实例
2018/08/30 Javascript
微信小程序设置滚动条过程详解
2019/07/25 Javascript
微信小程序 授权登录详解(附完整源码)
2019/08/23 Javascript
基于Vue中的父子传值问题解决
2020/07/27 Javascript
Python实现的递归神经网络简单示例
2017/08/11 Python
Python内置函数—vars的具体使用方法
2017/12/04 Python
Tensorflow 查看变量的值方法
2018/06/14 Python
Python实现bilibili时间长度查询的示例代码
2020/01/14 Python
英国航空官网:British Airways
2016/09/11 全球购物
联想台湾官网:Lenovo TW
2018/05/09 全球购物
StubHub澳大利亚:购买或出售您的门票
2019/08/01 全球购物
什么样的创业计划书可行性高?
2014/02/01 职场文书
文员的职业生涯规划发展方向
2014/02/08 职场文书
巡警年度自我鉴定
2014/02/21 职场文书
2014年五四青年节演讲稿范文
2014/04/22 职场文书
需求分析说明书
2014/05/09 职场文书
银行安全保卫工作总结
2015/08/10 职场文书
Python基础之数据结构详解
2021/04/28 Python
Java Optional<Foo>转换成List<Bar>的实例方法
2021/06/20 Java/Android