目录

timeit 简介

timeit 模块

简述

timeit是一个 Python 模块,用来帮助 Python 开发人员或量化工程师,测量指定的一小段 Python 代码块的运行耗时。timeit提供两种使用方式:

  • 命令行:由工程师直接在终端命令行运行timeit来测量指定的代码块;
  • 模块导入:在其它的 Python 代码中导入该模块,并调用它的相关方法。

 

命令行运行

可以通过执行以下命令来使用timeit:

1
python -m timeit [-n N] [-s S] [-u U] [-r R] [-p] [-v] [-h] [code snippets...]

各个命令行参数的功能如下:

  • -n N:每次执行代码块多少次;
  • -s S:执行代码块前,预先要执行一次的语句,用于预先准备环境等(默认为 pass语句);
  • -u U:指定显示最终结果的时间单位,可选项包括:sec, msec, usec, nsec;
  • -r R:重复整个测量的次数(默认为运行5次);
  • -p:只测量该代码块占用CPU的时间,即CPU时间,默认测量的是时钟时间(关于CPU时间和时钟时间,请参考其它相关);
  • -v:打印计时细节;
  • -h:打印帮助信息;
  • ‘code snippets’: 要测试的代码块

示例

1
python -m timeit -n 1000 -r 5 "[i for i in range(100)]"

总共测量5次,每次执行指定代码块1000次,该代码块遍历0~99并将数值复制到列表中。测量结果:

1
1000 loops, best of 5: 2.08 usec per loop

5次测量中,最佳的一次平均每个执行耗时2.08微妙。由于未指定参数‘-p’,所以测量的是时钟时间,而非CPU时间。

 

模块导入运行

timeit模块对外提供了三个 API 函数和一个类:

  • Timer

    Timer(stmt=‘pass’, setup=‘pass’, timer=[default timer], globals=None)

    该类构造的Timer对象,用于测量一次指定的代码块。同命令行参数类似,stmt 参数指定要测量的代码语句;setup 参数指定执行代码块前,预先要执行一次的语句;timer 指定定时器函数,默认为time.perf_counter(),即测量系统时钟时间,若想使用进程时间,则可以设为time.process_time()globals 指定执行代码的命名空间。

  • 函数timeit

    timeit(stmt=“pass”, setup=“pass”, timer=[default_timer], number=default_number, globals=None):

    调用Timer类的构造函数,用参数创建一个Timer实例,并调用该类的timeit函数 number 次来测量耗时。

  • 函数repeat:

    repeat(stmt=‘pass’, setup=‘pass’, timer=[default timer], repeat=5, number=1000000, globals=None)

    调用Timer类的构造函数,用参数创建一个Timer实例,使用参数中给定的 repeatnumber 来测量耗时。

  • 函数default_timer()

    default_timer()

    运行默认计时器,默认计时器为time.perf_counter(),该计时器测量的系统时钟时间,如需指定其它定时器,在调用其它API时指定 timer 参数即可。

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
>>> import timeit
>>> timeit.timeit("[i for i in range(100)]", number=10000)
0.024299769662320614
>>> import time
>>> timeit.timeit("[i for i in range(100)]", number=10000, timer=time.process_time)
0.023983645927435012
>>> t = timeit.Timer("[i for i in range(100)]")
>>> t.timeit(number=10000)
0.024422593075037003
>>> t.repeat(number=10000, repeat=3)
[0.024077987298369408, 0.02415329660177231, 0.023876846803426743]

 

其它相关

计时器

Python 常用的用于测量耗时的计时器有两种:time.perf_counter()time.process_time(),前者测量的是时钟时间,后者测量的CPU时间。Linux 为进程维护了三个时间:时钟时间用户CPU时间系统CPU时间

时钟时间又被称为墙上时钟时间wall clock time,它是进程从开始运行到结束的总耗时。time.perf_counter() 测量的就是这个总耗时。

用户CPU时间是CPU在执行进程的用户空间时消耗的时间,系统CPU时间是CPU在执行进程的内核空间时消耗的时间,用户CPU时间 + 系统CPU时间 = 进程运行时间,也就是CPU时间time.process_time() 测量的是这个耗时。

相同环境下,CPU时间小于等于时钟时间,因为进程的执行过程中,并不会full time占用CPU,中间会由于被操纵系统调度而发生时钟中断,或者等待I/O数据就绪的过程中被阻塞。

两个测量角度适用于不同目的的性能测试,作为量化工程师,只需记住以下两点即可:

  • 如果要比较不同代码块、算法、数据处理方式的执行效率,那么 time。process_time() 更合适;
  • 如果要测量整个模块或者程序在实际环境中的平均总耗时,那么 time.perf_counter() 更合适。

- 全文完 -

相关文章

「 您的赞赏是激励我创作和分享的最大动力! 」