在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 translator使用实例
Sep 06 Python
python获取远程图片大小和尺寸的方法
Mar 26 Python
用Python的Tornado框架结合memcached页面改善博客性能
Apr 24 Python
总结Python中逻辑运算符的使用
May 13 Python
Python利用正则表达式匹配并截取指定子串及去重的方法
Jul 30 Python
简单理解Python中的装饰器
Jul 31 Python
Python实现的线性回归算法示例【附csv文件下载】
Dec 29 Python
Django Rest framework认证组件详细用法
Jul 25 Python
PyTorch中 tensor.detach() 和 tensor.data 的区别详解
Jan 06 Python
Python Dict找出value大于某值或key大于某值的所有项方式
Jun 05 Python
python解释器安装教程的方法步骤
Jul 02 Python
python+pytest接口自动化之token关联登录的实现
Apr 06 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
javascript学习笔记(三) String 字符串类型介绍
2012/06/19 Javascript
容易造成JavaScript内存泄露几个方面
2014/09/04 Javascript
Node.js的Express框架使用上手指南
2016/03/12 Javascript
微信小程序 loading 详解及实例代码
2016/11/09 Javascript
jquery单击文字或图片内容放大并居中显示
2017/06/23 jQuery
jQuery实现的表格前端排序功能示例
2017/09/18 jQuery
JS简单实现父子窗口传值功能示例【未使用iframe框架】
2017/09/20 Javascript
微信小程使用swiper组件实现图片轮播切换显示功能【附源码下载】
2017/12/12 Javascript
详解webpack-dev-server使用方法
2018/09/14 Javascript
微信小程序发送短信验证码完整实例
2019/01/07 Javascript
详解js创建对象的几种方法及继承
2019/04/12 Javascript
Vue v-bind动态绑定class实例方法
2020/01/15 Javascript
[01:25]2014DOTA2国际邀请赛 zhou分析LGD比赛情况
2014/07/14 DOTA
python多线程threading.Lock锁用法实例
2014/11/01 Python
python实现爬虫统计学校BBS男女比例(一)
2015/12/31 Python
Python 基于Twisted框架的文件夹网络传输源码
2016/08/28 Python
python中装饰器级连的使用方法示例
2017/09/29 Python
详解Django 中是否使用时区的区别
2018/06/14 Python
Python 通过调用接口获取公交信息的实例
2018/12/17 Python
Python实现连接MySql数据库及增删改查操作详解
2019/04/16 Python
记录Python脚本的运行日志的方法
2019/06/05 Python
pandas实现to_sql将DataFrame保存到数据库中
2019/07/03 Python
Python使用mongodb保存爬取豆瓣电影的数据过程解析
2019/08/14 Python
python创建学生成绩管理系统
2019/11/22 Python
mac安装python3后使用pip和pip3的区别说明
2020/09/01 Python
如何查看浏览器对html5的支持情况
2020/12/15 HTML / CSS
世界上最大的售后摩托车零配件超市:J&P Cycles
2017/12/08 全球购物
const和static readonly区别
2013/05/20 面试题
《世界多美呀》教学反思
2014/03/02 职场文书
工业设计毕业生自荐信
2014/04/13 职场文书
辅导员评语
2014/05/04 职场文书
大学毕业生推荐信
2014/07/09 职场文书
2014年服装销售工作总结
2014/11/27 职场文书
复制别人的成功真的会成功吗?
2019/10/17 职场文书
请学会珍惜眼前,因为人生没有下辈子!
2019/11/12 职场文书
实现GO语言对数组切片去重
2022/04/20 Golang