在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 numpy函数中的linspace创建等差数列详解
Oct 13 Python
Django-Rest-Framework 权限管理源码浅析(小结)
Nov 12 Python
详解Python3 对象组合zip()和回退方式*zip
May 15 Python
Flask框架 CSRF 保护实现方法详解
Oct 30 Python
Python迷宫生成和迷宫破解算法实例
Dec 24 Python
Python如何使用字符打印照片
Jan 03 Python
Pytorch GPU显存充足却显示out of memory的解决方式
Jan 13 Python
PyCharm如何导入python项目的方法
Feb 06 Python
python爬虫实现POST request payload形式的请求
Apr 30 Python
图解Python中深浅copy(通俗易懂)
Sep 03 Python
浅析Python requests 模块
Oct 09 Python
pygame面向对象的飞行小鸟实现(Flappy bird)
Apr 01 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基础学习小结
2011/04/17 PHP
深入理解require与require_once与include以及include_once的区别
2013/06/05 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
2016/06/13 PHP
JavaScript Timer实现代码
2010/02/17 Javascript
extjs表格文本启用选择复制功能具体实现
2013/10/11 Javascript
jQuery插件datepicker 日期连续选择
2015/06/12 Javascript
jquery动感漂浮导航菜单代码分享
2020/04/15 Javascript
批量下载对路网图片并生成html的实现方法
2016/06/07 Javascript
使用Ajax生成的Excel文件并下载的实例
2016/11/21 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(2)
2017/02/20 Javascript
JavaScript函数节流的两种写法
2017/04/07 Javascript
原生js实现Flappy Bird小游戏
2018/12/24 Javascript
Node.js 如何利用异步提升任务处理速度
2019/01/07 Javascript
移动端底部导航固定配合vue-router实现组件切换功能
2019/06/13 Javascript
vue 实现路由跳转时更改页面title
2019/11/05 Javascript
Vue中使用better-scroll实现轮播图组件
2020/03/07 Javascript
v-slot和slot、slot-scope之间相互替换实例
2020/09/04 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
2020/11/26 Vue.js
JS中箭头函数与this的写法和理解
2021/01/14 Javascript
使用Python的内建模块collections的教程
2015/04/28 Python
Pyinstaller将py打包成exe的实例
2018/03/31 Python
对python list 遍历删除的正确方法详解
2018/06/29 Python
python实现梯度下降算法
2020/03/24 Python
如何利用Python分析出微信朋友男女统计图
2019/01/25 Python
深入了解Python枚举类型的相关知识
2019/07/09 Python
pytorch 把图片数据转化成tensor的操作
2021/03/04 Python
出国签证在职证明
2014/01/16 职场文书
小学中秋节活动方案
2014/02/06 职场文书
初中学校军训方案
2014/05/09 职场文书
2014年国庆节演讲稿
2014/09/02 职场文书
2014年学习厉行节约反对浪费思想汇报
2014/09/10 职场文书
2014年党员个人工作总结
2014/12/02 职场文书
2015年医德考评自我评价
2015/03/03 职场文书
2015年感恩节活动总结
2015/03/24 职场文书
导游词之西安大清真寺
2019/12/17 职场文书
Win11 Build 22000.51版本文件资源管理器“命令栏”和上下文菜单有什么新变化?
2021/11/21 数码科技