timeit 模块详解 -- 准确测量小段代码的执行时间

timeit 模块提供了测量 Python 小段代码执行时间的方法。它既可以在命令行界面直接使用,也可以通过导入模块进行调用。该模块灵活地避开了测量执行时间所容易出现的错误。

以下例子是命令行界面的使用方法:

$ python -m timeit '"-".join(str(n) for n in range(100))'
10000 loops, best of 3: 40.3 usec per loop
$ python -m timeit '"-".join([str(n) for n in range(100)])'
10000 loops, best of 3: 33.4 usec per loop
$ python -m timeit '"-".join(map(str, range(100)))'
10000 loops, best of 3: 25.2 usec per loop

以下例子是 IDLE 下调用的方法:

>>> import timeit
>>> timeit.timeit('"-".join(str(n) for n in range(100))', number=10000)
0.8187260627746582
>>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000)
0.7288308143615723
>>> timeit.timeit('"-".join(map(str, range(100)))', number=10000)
0.5858950614929199

需要注意的是,只有当使用命令行界面时,timeit 才会自动确定重复的次数。

timeit 模块

该模块定义了三个实用函数和一个公共类。

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

创建一个 Timer 实例,参数分别是 stmt(需要测量的语句或函数),setup(初始化代码或构建环境的导入语句),timer(计时函数),number(每一次测量中语句被执行的次数)

注:由于 timeit() 正在执行语句,语句中如果存在返回值的话会阻止 timeit() 返回执行时间。timeit() 会取代原语句中的返回值。

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

创建一个 Timer 实例,参数分别是 stmt(需要测量的语句或函数),setup(初始化代码或构建环境的导入语句),timer(计时函数),repeat(重复测量的次数),number(每一次测量中语句被执行的次数)

timeit.default_timer()

默认的计时器,一般是 time.perf_counter(),time.perf_counter() 方法能够在任一平台提供最高精度的计时器(它也只是记录了自然时间,记录自然时间会被很多其他因素影响,例如计算机的负载)。

class timeit.Timer(stmt='pass', setup='pass', timer=<timer function>) 

计算小段代码执行速度的类,构造函数需要的参数有 stmt(需要测量的语句或函数),setup(初始化代码或构建环境的导入语句),timer(计时函数)。前两个参数的默认值都是 'pass',timer 参数是平台相关的;前两个参数都可以包含多个语句,多个语句间使用分号(;)或新行分隔开。

第一次测试语句的时间,可以使用 timeit() 方法;repeat() 方法相当于持续多次调用 timeit() 方法并将结果返回为一个列表。

stmt 和 setup 参数也可以是可供调用但没有参数的对象,这将会在一个计时函数中嵌套调用它们,然后被 timeit() 所执行。注意,由于额外的调用,计时开销会相对略到。

- timeit(number=1000000) 

功能:计算语句执行 number 次的时间。

它会先执行一次 setup 参数的语句,然后计算 stmt 参数的语句执行 number 次的时间,返回值是以秒为单位的浮点数。number 参数的默认值是一百万,stmt、setup 和 timer 参数由 timeit.Timer 类的构造函数传递。

注意:默认情况下,timeit() 在计时的时候会暂时关闭 Python 的垃圾回收机制。这样做的优点是计时结果更具有可比性,但缺点是 GC(garbage collection,垃圾回收机制的缩写)有时候是测量函数性能的一个重要组成部分。如果是这样的话,GC 可以在 setup 参数执行第一条语句的时候被重新启动,例如:

timeit.Timer('for i in range(10): oct(i)', 'gc.enable()').timeit()

- repeat(repeat=3, number=1000000) 

功能:重复调用 timeit()。

repeat() 方法相当于持续多次调用 timeit() 方法并将结果返回为一个列表。repeat 参数指定重复的次数,number 参数传递给 timeit() 方法的 number 参数。

注意:人们很容易计算出平均值和标准偏差,但这并不是非常有用。在典型的情况下,最低值取决于你的机器可以多快地运行给定的代码段;在结果中更高的那些值通常不是由于 Python 的速度导致,而是因为其他进程干扰了你的计时精度。所以,你所应感兴趣的只有结果的最低值(可以用 min() 求出)。

- print_exc(file=None) 

功能:输出计时代码的回溯(Traceback)

典型的用法:

t = Timer(...)       # outside the try/except
try:t.timeit(...)    # or t.repeat(...)
except Exception:t.print_exc()

标准回溯的优点是在编译模板中,源语句行会被显示出来。可选的 file 参数指定将回溯发送的位置,默认是发送到 sys.stderr。

命令行界面

当被作为命令行程序调用时,可以使用下列选项:

  1. python -m timeit [-n N] [-r N] [-s S] [-t] [-c] [-h] [statement ...]

复制代码

各个选项的含义:

选项 原型 含义
-n N --number=N 执行指定语句(段)的次数
-r N --repeat=N 重复测量的次数(默认 3 次)
-s S --setup=S 指定初始化代码或构建环境的导入语句(默认是 pass)
-p --process 测量进程时间而不是实际执行时间(使用 time.process_time() 代替默认的 time.perf_counter())
以下是 Python3.3 新增:    
-t --time 使用 time.time()(不推荐)
-c --clock 使用 time.clock()(不推荐)
-v --verbose 打印原始的计时结果,输出更大精度的数值
-h --help 打印一个简短的用法信息并退出

示例

以下演示如果在开始的时候设置初始化语句:

命令行:


$ python -m timeit -s 'text = "I love FishC.com!"; char = "o"'  'char in text'
10000000 loops, best of 3: 0.0877 usec per loop
$ python -m timeit -s 'text = "I love FishC.com!"; char = "o"'  'text.find(char)'
1000000 loops, best of 3: 0.342 usec per loop

使用 timeit 模块:

  1. >>> import timeit
    >>> timeit.timeit('char in text', setup='text = "I love FishC.com!"; char = "o"')
    0.41440500499993504
    >>> timeit.timeit('text.find(char)', setup='text = "I love FishC.com!"; char = "o"')
    1.7246671520006203
    

使用 Timer 对象:

>>> import timeit
>>> t = timeit.Timer('char in text', setup='text = "I love FishC.com!"; char = "o"')
>>> t.timeit()
0.3955516149999312
>>> t.repeat()
[0.40193588800002544, 0.3960157959998014, 0.39594301399984033]

以下演示包含多行语句如何进行测量:

(我们通过 hasattr() 和 try/except 两种方法测试属性是否存在,并且比较它们之间的效率)

命令行:

$ python -m timeit 'try:' '  str.__bool__' 'except AttributeError:' '  pass'
100000 loops, best of 3: 15.7 usec per loop
$ python -m timeit 'if hasattr(str, "__bool__"): pass'
100000 loops, best of 3: 4.26 usec per loop$ python -m timeit 'try:' '  int.__bool__' 'except AttributeError:' '  pass'
1000000 loops, best of 3: 1.43 usec per loop
$ python -m timeit 'if hasattr(int, "__bool__"): pass'
100000 loops, best of 3: 2.23 usec per loop

使用 timeit 模块:

>>> import timeit
>>> # attribute is missing
>>> s = """\
... try:
...     str.__bool__
... except AttributeError:
...     pass
... """
>>> timeit.timeit(stmt=s, number=100000)
0.9138244460009446
>>> s = "if hasattr(str, '__bool__'): pass"
>>> timeit.timeit(stmt=s, number=100000)
0.5829014980008651
>>>
>>> # attribute is present
>>> s = """\
... try:
...     int.__bool__
... except AttributeError:
...     pass
... """
>>> timeit.timeit(stmt=s, number=100000)
0.04215312199994514
>>> s = "if hasattr(int, '__bool__'): pass"
>>> timeit.timeit(stmt=s, number=100000)
0.08588060699912603

为了使 timeit 模块可以测量你的函数,你可以在 setup 参数中通过 import 语句导入:

def test():"""Stupid test function"""L = [i for i in range(100)]if __name__ == '__main__':import timeitprint(timeit.timeit("test()", setup="from __main__ import test"))

Python timeit 模块详解(准确测量小段代码的执行时间)相关推荐

  1. timeit 模块详解(准确测量小段代码的执行时间)

    ##timeit 模块详解 – 准确测量小段代码的执行时间 timeit 模块提供了测量 Python 小段代码执行时间的方法.它既可以在命令行界面直接使用,也可以通过导入模块进行调用.该模块灵活地避 ...

  2. python time模块详解

    python time模块详解 转自:http://blog.csdn.net/kiki113/article/details/4033017 python 的内嵌time模板翻译及说明    一.简 ...

  3. Python—requests模块详解

    Python-requests模块详解 来源(博客园@小L小 ):Python-requests模块详解

  4. python re正则_正则表达式+Python re模块详解

    正则表达式(Regluar Expressions)又称规则表达式,在代码中常简写为REs,regexes或regexp(regex patterns).它本质上是一个小巧的.高度专用的编程语言. 通 ...

  5. python cx_oracle模块详解_cx_Oracle模块详解

    1.安装cx_Oracle模块 1-1.环境准备: 1-1-1.oracle client最小安装 instantclient-sqlplus-linux.x64-11.2.0.4.0 instant ...

  6. Python shutil 模块详解

    Python shutil 模块详解 1.模块介绍 2.copytree 示例 3.move 示例 1.模块介绍 import shutil# copy data from file-like obj ...

  7. python six模块详解_对python中的six.moves模块的下载函数urlretrieve详解

    实验环境:windows 7,anaconda 3(python 3.5),tensorflow(gpu/cpu) 函数介绍:所用函数为six.moves下的urllib中的函数,调用如下urllib ...

  8. Python Tkinter模块详解(后续持续补充)

    声明:该文章是个人学习中写的,目的是总结及当作工具参考,有一定的借鉴成分,后续若有新发现则补充 目录 Tkinter简介 创建组件基本语法 Tkinter组件汇总 Variable 类 常见参数详解 ...

  9. python pexpect模块详解_python pexpect原理详解及使用说明

    pexpect是python中用于实现SSH,FTP,telnet等命令进行自动化交互,从而无需人工干预实现自动化运维的一个第三方扩展模块.理论的描述过于抽象,这里首先设想一下,如果让您设计一个实现自 ...

最新文章

  1. mac系统添加VSCode到右键菜单(转)
  2. 利用循环,使得10 * 10的二维数组具有以下值,并按以下结构输出在屏幕上
  3. 微信公众平台关于fakeid和openid的解析
  4. 从零入门 Serverless | 教你 7 步快速构建 GitLab 持续集成环境
  5. linux scp密码参数,使用scp命令安全地传输带有参数的文件
  6. mysql投票网站_PHP+Mysql实现网站顶和踩投票功能实例
  7. DeadObjectException
  8. Android——ASM 极速上手 简单使用
  9. 国防科技大学《编译原理》慕课测试题整理
  10. 关于C语言全局变量定义和引用写法总结
  11. 奈奎斯特稳定性判据的步骤(含详细推导)
  12. 《FPGA设计实战演练》学习笔记(二)FPGA核心板电路设计
  13. 《代码大全》读书笔记(转载)
  14. 【转】SAP 各种记账凭证的更改冲销
  15. 音效算法学习笔记(一)fader 增益调节器
  16. 前端图表类可视化插件
  17. Zain Iraq通过MATRIXX Software推出突破性数字品牌oodi
  18. ssd(Single Shot MultiBox Detector)解读之(一)原理解析
  19. 发生房屋租赁合同纠纷如何解决
  20. CrossOver Mac2022虚拟机如何安装win10系统和linux系统

热门文章

  1. 排列组合——n个人平均分成m组
  2. 使用SigmaPlot绘制折线图
  3. tigase mysql_tigase5.2.3使用mysql5.6出错
  4. Hibternate框架笔记
  5. List、Set 区别
  6. ESP32学习笔记(43)——SD卡使用(SDMMC方式)
  7. 宋图图的Mysql01
  8. ofo被追索2.5亿 法院:已无可执行财产,多名高管成老赖
  9. excel 第七讲:认识公式与函数
  10. 《人人都在晒,凭什么你出彩》读书笔记