timeit 简介
timeit 模块
简述
timeit
是一个 Python 模块,用来帮助 Python 开发人员或量化工程师,测量指定的一小段 Python 代码块的运行耗时。timeit
提供两种使用方式:
- 命令行:由工程师直接在终端命令行运行
timeit
来测量指定的代码块; - 模块导入:在其它的 Python 代码中导入该模块,并调用它的相关方法。
命令行运行
可以通过执行以下命令来使用timeit
:
|
|
各个命令行参数的功能如下:
- -n N:每次执行代码块多少次;
- -s S:执行代码块前,预先要执行一次的语句,用于预先准备环境等(默认为
pass
语句); - -u U:指定显示最终结果的时间单位,可选项包括:
sec
,msec
,usec
,nsec
; - -r R:重复整个测量的次数(默认为运行5次);
- -p:只测量该代码块占用CPU的时间,即CPU时间,默认测量的是时钟时间(关于CPU时间和时钟时间,请参考其它相关);
- -v:打印计时细节;
- -h:打印帮助信息;
- ‘code snippets’: 要测试的代码块
示例
|
|
总共测量5次,每次执行指定代码块1000次,该代码块遍历0~99并将数值复制到列表中。测量结果:
|
|
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
实例,使用参数中给定的 repeat 和 number 来测量耗时。 -
函数
default_timer()
default_timer()
运行默认计时器,默认计时器为
time.perf_counter()
,该计时器测量的系统时钟时间,如需指定其它定时器,在调用其它API时指定 timer 参数即可。
示例
|
|
其它相关
计时器
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() 更合适。
「 您的赞赏是激励我创作和分享的最大动力! 」
- 原文链接:https://zhuyinjun.me/2021/introduction_of_timeit/
- 版权声明:本创作采用 CC BY-NC 4.0 国际许可协议,非商业性使用可以转载,但请注明出处(作者、链接),商业性使用请联系作者获得授权。