Python timeit模块

时间:2020-02-23 14:43:36  来源:igfitidea点击:

在衡量一段Python代码的执行时间时,我们有很多想法。
简单地使用时间模块并节省程序执行前后的时间怎么样?听起来很简单,但事实并非如此。

Python timeit

当程序正在执行时,许多后台进程也会运行以使该代码可执行。
时间模块不考虑这些过程。
如果您需要精确的时间性能测量,可以使用" timeit"模块。

" timeit"模块运行一段代码一百万次(默认值),并考虑了运行这段代码所需的最短时间。
让我们在这里看看实际的模块!

查找Python代码的执行时间

有多种方法可以使用" timeit"模块。
最简单的方法之一是直接在Python CLI上使用它。
在进入更多示例之前,我们将在第一个示例中进行此操作。

Python timeit示例

我们将从直接从Python CLI使用timeit模块开始。
当使用CLI时,我们将注意到模块otself决定对同一段代码执行的重复次数。
这是我们针对不同表达式执行的示例命令:

$python -m timeit '"-".join(str(n) for n in range(100))'
$python -m timeit '"-".join([str(n) for n in range(100)])'
$python -m timeit '"-".join(map(str, range(100)))'

计时一段代码

使用timeit模块的最好之处在于,我们可以确定要为其评估性能的确切代码段。
我们将分别定义设置代码和性能测试代码。
设置代码仅运行一次,而主代码则运行一百万次:

import timeit
 
# setup code is executed just once
mysetup = "from math import sqrt"
 
# main code snippet for performance check
mycode = '''
def example():
  mylist = []
  for x in range(100):
      mylist.append(sqrt(x))
'''
 
# timeit statement
print(timeit.timeit(setup = mysetup,
                  stmt = mycode,
                  number = 10000))

请注意,最好将import语句保留在设置代码中,以免在执行主代码时进行任何更改。

从CLI记录多行代码的时间

如果编写脚本对您来说不可行,并且您想快速查看代码的性能,那么也可以选择直接从CLI使用代码:

$python3 -m timeit -s \
> "jd = {}" \
> "for idx in range(1000):" \
> "  jd[str(idx)] = idx"

通常比较两个代码块

如果您只想通过比较两段代码相对于另一段代码运行的速度来获得一个非常简单的想法,那么有一种非常简单的方法:

import timeit

start_time = timeit.default_timer()
func1()
print(timeit.default_timer() - start_time)

start_time = timeit.default_timer()
func2()
print(timeit.default_timer() - start_time)

只需使用default_timer()函数来开始计时,然后再一次发现差异即可。
这是使用模块查找代码性能的最简单方法。
这也迫使您以函数的形式来编写代码,这些函数是模块化的实体。

另一种执行相同操作而不接触原始脚本的方法是说test.py,它包含如下功能:

def RadixSort(): ...
def TimSort(): ...

像这样使用timeit模块:

$python -m timeit -s 'import test' 'test.RadixSort()'
$python -m timeit -s 'import test' 'test.TimSort()'