timeit的功能和用法

timeit 模块提供了测试一小段代码运行时间的功能。我前面有一篇文章用它来测试定义 __slots__ 对对象访问速度的提升情况,参见这里

官方文档 上有下面这样的使用例子:

# 从命令行调用
python -m timeit '"-".join([str(n) for n in range(100)])' # 从REPL调用
>>> import timeit
>>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000)
0.7288308143615723

使用 timeit 的时候可以直接调用其定义好的 timeit.timeit , timeit.repeat , timeit.default_timer 方法,或者定义一个类 timeit.Timer ,使用本身的方法。

# API

timeit.timeit(stmt='pass', setup='pass', timer=<default timer>, number=1000000)

timeit.repeat(stmt='pass', setup='pass', timer=<default timer>, repeat=3, number=1000000)

class timeit.Timer(stmt='pass', setup='pass', timer=<timer function>)¶
  • timeit() 接受的第一个参数stmt为要计算时间的表达式,第二个参数setup为初始化的表达式。
  • timer参数为计时器,在不同平台默认不一样,参照这里 ,但不管是Unix还是Windows测得的时间都是系统经过的时间,所以是有可能被正在运行的其它程序影响的。
  • number参数是表达式执行的次数,所以这里返回的时间是执行1000000次总和的时间。
  • timeit.repeat() 中的repeat参数是测试重复执行的次数,相当于调用number次的timeit(),number默认为3,返回3次运行时间的列表,通常可以取min()来评估程序的执行时间。
  • timeit.repeat() 中除了最小值其他的值得参考意义可能不大,因为有可能是受到系统中其它程序影响导致的
  • 注意python版本不同导致的接口参数不同,这里默认采用python2.7版本

接下来看一些复杂点的示例

# 多行表达式的调用
>>> import timeit
>>> attribute is missing
>>> s = """\
... try:
... str.__nonzero__
... except AttributeError:
... pass
... """
>>> timeit.timeit(stmt=s, number=100000)
0.9138244460009446 # 测试函数调用时间
def test():
"""Stupid test function"""
L = []
for i in range(100):
L.append(i) if __name__ == '__main__':
import timeit
print(timeit.timeit("test()", setup="from __main__ import test"))

其它

当我在网上浏览timeit相关资源时看到了这篇文章, 上面提到了通过上下文管理器(context manager)实现一个计时器,利用了变量的生命周期相关特性(#TODO),虽然就像作者所说,可以加上其它的特性比如循环次数等以及更优雅的实现一个计时器,代码如下,可供参考:

# Source code: https://gist.github.com/pengmeng/78a25663c20ab8890b81
__author__ = 'mengpeng'
import time class timeme(object):
__unitfactor = {'s': 1,
'ms': 1000,
'us': 1000000} def __init__(self, unit='s', precision=4):
self.start = None
self.end = None
self.total = 0
self.unit = unit
self.precision = precision def __enter__(self):
if self.unit not in timeme.__unitfactor:
raise KeyError('Unsupported time unit.')
self.start = time.time()
return self def __exit__(self, exc_type, exc_val, exc_tb):
self.end = time.time()
self.total = (self.end - self.start) * timeme.__unitfactor[self.unit]
self.total = round(self.total, self.precision) def __str__(self):
return 'Running time is {0}{1}'.format(self.total, self.unit)

运行示例:

from timeme import timeme
with timeme('ms', 6) as t:
result = sum(range(100000)) print(t) # Running time is 5.2948ms
print(t.total) # 5.2948

参考资料

计算运行时间工具timeit的更多相关文章

  1. QuantLib 金融计算——数学工具之数值积分

    目录 QuantLib 金融计算--数学工具之数值积分 概述 常见积分方法 高斯积分 如果未做特别说明,文中的程序都是 Python3 代码. QuantLib 金融计算--数学工具之数值积分 载入模 ...

  2. QuantLib 金融计算——数学工具之求解器

    目录 QuantLib 金融计算--数学工具之求解器 概述 调用方式 非 Newton 算法(不需要导数) Newton 算法(需要导数) 如果未做特别说明,文中的程序都是 Python3 代码. Q ...

  3. QuantLib 金融计算——数学工具之插值

    目录 QuantLib 金融计算--数学工具之插值 概述 一维插值方法 二维插值方法 如果未做特别说明,文中的程序都是 Python3 代码. QuantLib 金融计算--数学工具之插值 载入模块 ...

  4. QuantLib 金融计算——数学工具之优化器

    目录 QuantLib 金融计算--数学工具之优化器 概述 Optimizer Constraint OptimizationMethod EndCriteria 示例 Rosenbrock 问题 校 ...

  5. QuantLib 金融计算——数学工具之随机数发生器

    目录 QuantLib 金融计算--数学工具之随机数发生器 概述 伪随机数 正态分布(伪)随机数 拟随机数 HaltonRsg SobolRsg 两类随机数的收敛性比较 如果未做特别说明,文中的程序都 ...

  6. Java生日计算年龄工具

    package com.web.backend.util; import java.util.Calendar;import java.util.Date; /** * @Author: SongZS ...

  7. python学习笔记之三-计算运行时间

    方法1 import datetime starttime = datetime.datetime.now() #long running endtime = datetime.datetime.no ...

  8. 测试命令运行时间:timeit和profile

    先说timeit from timeit import Timer def test1(): n=0 for i in range(101): n+=i return n def test2(): r ...

  9. Java代码计算运行时间

    突然想准确的测试一下Java代码的执行时间,在网上找了一会.发现基本有以下两种方法:第一种是以毫秒为单位计算的. Java代码 //伪代码 long startTime=System.currentT ...

随机推荐

  1. home-brew 安装&下载

    安装: ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)&qu ...

  2. C#修改下拉框选项的高度

    重写ListBox.DrawItem事件处理,别忘记将ListBox.DrawMode 设置为OwnerDrawVariable,ListBox.ItemHeight值改大一点,字体也适当放大一号. ...

  3. 第二百二十八天 how can I 坚持

    hibernate 还有好多不会搞啊,本来很简单的东西,没用过就不会. 今天... 只是感觉很累,昨天爬山爬的,不知道该写点啥了,买的羽绒服到了,还行吧,凑合穿吧. 睡觉了.今天貌似又发脾气了.哎.. ...

  4. delphi 判断调试状态

    DebugHook 该变量在调试状态下值为1,运行模式为0,例如,我们可以使用如下的代码来简单控制: if DebugHook=0 then

  5. CentOS下MySQL 5.7.9编译安装

    MySQL 5.7 GA版本的发布,也就是说从现在开始5.7已经可以在生产环境中使用,有任何问题官方都将立刻修复. MySQL 5.7主要特性: 更好的性能:对于多核CPU.固态硬盘.锁有着更好的优化 ...

  6. 转】MyEclipse使用总结——MyEclipse文件查找技巧

    原博文出自于:http://www.cnblogs.com/xdp-gacl/p/3781749.html 感谢! 一.查找文件 使用快捷键[ctrl+shift+R]弹出弹出文件查找框,如下图所示: ...

  7. 给Adobe Reader添加书签功能

    Adobe Acrobat Professional和Adobe Reader都是Adobe公司的产品.前者用来编辑制作PDF文档,后者只能用来阅读PDF.令人郁闷的是Adobe Reader中虽然有 ...

  8. KVM 虚拟机命令行安装配置

    KVM作为linux内核的一部分,有着无法比拟的优势,相信KVM的大范围企业应用指日可待. 一.KVM宿主服务器环境配置 1. 查看CPU是否支持VT技术 cat /proc/cpuinfo | eg ...

  9. 安装、设置与启动MySql5.1.30绿色版的方法

    1.解压 mysql-noinstall-5.1.30-win32.zip(下载地址http://dev.mysql.com/downloads/mysql/5.1.html) 2.在 F 盘建立目录 ...

  10. UI:UITableView 编辑、cell重用机制

    tableView编辑.tableView移动.UITableViewController tableView的编辑:cell的添加.删除. 使⽤场景: 删除⼀个下载好的视频,删除联系⼈: 插⼊⼀条新 ...