计算运行时间工具timeit
Table of Contents
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的更多相关文章
- QuantLib 金融计算——数学工具之数值积分
		目录 QuantLib 金融计算--数学工具之数值积分 概述 常见积分方法 高斯积分 如果未做特别说明,文中的程序都是 Python3 代码. QuantLib 金融计算--数学工具之数值积分 载入模 ... 
- QuantLib 金融计算——数学工具之求解器
		目录 QuantLib 金融计算--数学工具之求解器 概述 调用方式 非 Newton 算法(不需要导数) Newton 算法(需要导数) 如果未做特别说明,文中的程序都是 Python3 代码. Q ... 
- QuantLib 金融计算——数学工具之插值
		目录 QuantLib 金融计算--数学工具之插值 概述 一维插值方法 二维插值方法 如果未做特别说明,文中的程序都是 Python3 代码. QuantLib 金融计算--数学工具之插值 载入模块 ... 
- QuantLib 金融计算——数学工具之优化器
		目录 QuantLib 金融计算--数学工具之优化器 概述 Optimizer Constraint OptimizationMethod EndCriteria 示例 Rosenbrock 问题 校 ... 
- QuantLib 金融计算——数学工具之随机数发生器
		目录 QuantLib 金融计算--数学工具之随机数发生器 概述 伪随机数 正态分布(伪)随机数 拟随机数 HaltonRsg SobolRsg 两类随机数的收敛性比较 如果未做特别说明,文中的程序都 ... 
- Java生日计算年龄工具
		package com.web.backend.util; import java.util.Calendar;import java.util.Date; /** * @Author: SongZS ... 
- python学习笔记之三-计算运行时间
		方法1 import datetime starttime = datetime.datetime.now() #long running endtime = datetime.datetime.no ... 
- 测试命令运行时间:timeit和profile
		先说timeit from timeit import Timer def test1(): n=0 for i in range(101): n+=i return n def test2(): r ... 
- Java代码计算运行时间
		突然想准确的测试一下Java代码的执行时间,在网上找了一会.发现基本有以下两种方法:第一种是以毫秒为单位计算的. Java代码 //伪代码 long startTime=System.currentT ... 
随机推荐
- flex编译命令相关
			最近碰到几次flex组件集版本问题,mx容器包含s组件,错误百出,会一直提示皮肤文件错误,上网查了一下,只要在工程属性中--->Flex编译器--->附加的编译参数中加入如下命令行即可:- ... 
- China特色创新现状
			1,unity桌面 2,http://www.cs2c.com.cn/ 3,http://os.51cto.com/art/200602/20350.htm 4,http://zhidao.baidu ... 
- HDU 4602 Magic Ball Game(离线处理,树状数组,dfs)
			Magic Ball Game Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ... 
- RingBuffer源代码分析
			看到一篇写的非常详细的帖子,为防止楼主删帖后找不到,果断转载过来 RingBuffer源代码分析 出处:http://bbs.ickey.cn/community/forum.php?mod=view ... 
- mysql慢查询Slow Query Log和未使用索引(Not Using Indexes)查询配置和使用
			mysql的“慢查询”指的是超过了允许的最大查询时间(long_query_time)的sql语句,而“未使用索引”查询顾名思义就是查询语句没有使用到索引的sql语句. 慢查询配置和使用 在msyql ... 
- 要后台控制前台的的CSS样式,我们可以加入ASP.NET Literal 控件
			ASP.NET Literal 控件,用于在页面上显示文本.此文本是可编程的. 我用它来制作了 ) { this.LtdMemberPromotion7.Text = "<style ... 
- HDU 5884 Sort (二分)
			题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5884 nn个有序序列的归并排序.每次可以选择不超过kk个序列进行合并,合并代价为这些序列的长度和.总的 ... 
- iOS国际化多语言设置
			一.创建工程.添加语言 
- 函数 MultiByteToWideChar() 详解
			函数原型: int MultiByteToWideChar( UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cchMultiByte ... 
- (剑指Offer)面试题17:合并两个排序的链表
			题目: 输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然时按照递增排序的. 链表结点定义如下: struct ListNode{ int val; ListNode* next; }; 思 ... 
