一、引言
在Python中,如果需要测量一段代码的执行时间,通常可以使用time模块,通过记录开始和结束时间,计算两个时间之差得到执行时间。但是,这种方法有以下缺点:一方面,time模块仅仅能够测量代码的全局执行时间,无法知道代码中每个语句执行所花费的时间;另一方面,在实际使用时,由于Python的解释执行方式,相邻代码执行顺序可能会产生微小的差异,导致测试结果不准确。对于这些问题,Python提供了Timeit模块来进行精确的时间测量。下面我们将详细介绍Timeit模块的使用。
二、基本使用
Timeit模块中最常用的函数是timeit()。它能够自动重复运行一段代码,并测量多次运行所花费的时间,并返回平均时间。timeit()函数需要传入两个参数:第一个参数是要测试的代码所在的字符串;第二个参数是指定测试运行次数和测试的环境。下面是一个示例:
import timeit # 测试求和函数 def sum_func(): total = 0 for i in range(1000): total += i return total # 测试 t = timeit.timeit('sum_func()', setup='from __main__ import sum_func', number=1000) print(t)
上述代码中,我们定义了一个求和函数sum_func(),使用timeit()函数进行多次测试,并输出平均运行时间。其中,第一个参数传入了待测试代码的字符串形式;第二个参数指定了测试环境,通过from __main__ import语句,将sum_func()函数导入测试环境中。最后一个参数number指定了运行次数,这里我们进行了1000次运行测试。执行该段代码后,即可输出测试平均用时。
三、高级使用
1、测试语句所花费的时间
在实际代码测试过程中,往往需要知道每一个语句所花费的时间。Timeit模块提供了repeat()函数,它会多次运行一段代码,并返回每次运行的时间。可以通过这一函数获取每个语句单独的运行时间,也可以获取多次运行结果的统计信息。
import timeit # 测试一句话代码 t = timeit.timeit('"-".join(str(n) for n in range(100))', number=10000) print(t) # 测试多句话代码 stmt = ''' total = 0 for i in range(1000): total += i ''' t = timeit.timeit(stmt, number=10000) print(t)
上面的例子中,我们使用timeit()函数测试了一句代码和多句代码的运行时间,并在测试完成后输出了平均运行时间。
2、设置全局变量与局部变量
默认情况下,timeit()函数测试的代码是在一个新的命名空间中执行的。如果有全局变量、类、函数等需要导入,需要在函数中传递一个global
语句或者在setup
参数中导入。
import timeit # 测试全局变量 x = list(range(2000000)) def test(): global x x.sort() print(timeit.timeit('test()', setup='from __main__ import test', number=1000)) # 测试局部变量 def test2(): x = list(range(2000000)) x.sort() print(timeit.timeit('test2()', setup='from __main__ import test2', number=1000))
测试完成后会输出平均运行时间。在第一个示例中,由于x为全局变量,我们需要在函数中添加global
语句。而在第二个示例中,由于x只在函数内部使用,不需要在函数中添加任何特殊语句。
3、使用Timer对象
Timeit模块中还提供了一个Timer类,它可以更方便地进行代码测试。Timer类的常用方法是timeit()
,它与timeit()
函数的使用方式相同,接收相同的参数,但对于相同的测试代码,Timer实例的timeit()
方法可能会得到更准确的计时值。
import timeit # 声明计时器 t = timeit.Timer('"-".join(str(n) for n in range(100))') # 执行测试 print(t.timeit())
以上代码中,我们声明了一个计时器t,然后使用test()方法测试。timeit()
方法会返回执行测试所花费的时间。这里我们只测试了一句话代码,测试多句话代码的方式与timeit()函数相同。
总结
Timeit模块是一个非常实用的模块,它能够高度精确地测试代码运行时间,并且支持多种测试方式。这些功能在一些对速度要求高的应用程序和测量程序性能的时候非常有用。