通过修饰器实现函数运行时间的计算
在之前介绍Python修饰器的几篇文章中,提到修饰器的一种应用场景——计算并打印代码执行时间,如下 runtime 修饰器:
我们使用 runtime 修饰器,对需要关注执行时间函数进行修饰,如下
遇见 Timeit
Python 内置模块 timeit 模块与 time 模块都可以实现对代码运行时间的计算,但 timeit 模块是专门用来测试代码运行时间的,提供了更多灵活的计算方法,并且相对精度也会更高。
我们先来看一下,同样计算一个函数的运行时间,使用 timeit 如何实现。
不难看出,timeit 还是比较灵活简单的。接下来,我们深入的了解一下 timeit 模块常用的两个函数 。
timeit 函数
创建一个 Timer实例,返回运行 stmt 这段代码 number 遍所用的时间,单位为秒。
语法
参数说明
- stmt:用于传入要测试时间的代码,可以直接接受字符串的表达式,也可以接受单个变量,也可以接受函数。传入函数时要把函数申明在当前文件中,然后在 stmt = 'func()' 执行函数,然后使用 setup = 'from main import func'。
- setup:初始化代码或构建环境的导入语句,比如 stmt中使用到的参数、变量,要导入的模块等,多行语句的话,使用分号分隔,同时该语句不计入时间,一般是 from ... import ...。
- timer:计时函数,win32下是time.clock(),linux下是 time.time(),Python的标准库手册推荐在任何系统下都尽量使用 time.clock()。
- number:默认 100000,每一次测量中语句被执行的次数。
示例
执行上述代码,输出结果为:
如果我们只是想计算 com函数里 sum([i 2 for i in rn]) 代码的运行时间,我们可以直接使用 timeit.timeit 方法,上述代码可以调整为:
repeat 函数
创建一个 Timer实例,通过repeat 参数指定重复测试的次数,返回包含每次测试的执行时间的列表,利用这一函数可以很方便得实现多次试验取平均的方法。
语法
参数说明
- stmt:用于传入要测试时间的代码,可以直接接受字符串的表达式,可以接受单个变量或者函数。传入函数时要把函数申明在当前文件中,然后在 stmt = 'func()' 执行函数,然后使用 setup = 'from main import func'。
- setup:初始化代码或构建环境的导入语句,比如 stmt中使用到的参数、变量,要导入的模块等,多行语句的话,使用分号分隔,同时该语句不计入时间,一般是 from ... import ...。
- timer:计时函数,win32下是 time.clock(),linux下是 time.time(),Python的标准库手册推荐在任何系统下都尽量使用 time.clock()。
- repeat:默认3次,测试要重复几次,每次的结果构成列表返回。
- number:默认100000次,每一次测量中语句被执行的次数。
示例
执行上述代码,输出结果为: