这是使用 timeit 模块的正确方法吗?
Is this the proper way to use the timeit module?
我有以下代码和结果。
测试 1 和 2 是相同的(至少我认为它们是相同的)但它们总是花费不同的时间 运行。
我的问题是:
- 我使用
timeit()
正确吗?
- 在评估一种语法与另一种语法时,毫秒是否重要?
- 如果我没有做错什么,为什么会有不同?
timeit
是测试性能的正确方法还是有更好的方法?
代码:
import timeit
def test1(a="String1", b="String2", c="String3",
d="I took a heavenly ride through our silence "):
r = a + b + c + d
def test2(e="String1", f="String2", g="String3",
h="I took a heavenly ride through our silence "):
s = e + f + g + h
def test3(e="String1", f="String2", g="String3",
h="I took a heavenly ride through our silence "):
t = e.join([f,g,h])
if __name__ == '__main__':
reps = 10000000
print("Test 1")
print(timeit.timeit("test1()", number=reps,
setup="from __main__ import test1"))
print("Test 2")
print(timeit.timeit("test2()", number=reps,
setup="from __main__ import test2"))
print("Test 3")
print(timeit.timeit("test3()", number=reps,
setup="from __main__ import test3"))
print(" ")
print(" ")
print("Test 2")
print(timeit.timeit("test2()", number=reps,
setup="from __main__ import test2"))
print("Test 1")
print(timeit.timeit("test1()", number=reps,
setup="from __main__ import test1"))
print("Test 3")
print(timeit.timeit("test3()", number=reps,
setup="from __main__ import test3"))
结果:
Test 1
3.46861560261924
Test 2
3.4760945739099185
Test 3
6.51532737832723
Test 2
3.475778266347378
Test 1
3.465791808905923
Test 3
6.493744207694682
文档 link.
系统上的进程 运行 可能会干扰计时,因为
timeit 测量时钟时间,而不是 CPU 时间。
默认情况下,timeit()
会在计时期间暂时关闭垃圾收集。这种方法的优点是它使独立计时更具可比性。这个缺点是GC可能是被测函数性能的重要组成部分。
重复调用timeit()
,
def test():
L = []
for i in range(10):
L.append(i)
if __name__ == '__main__':
import timeit
print(timeit.repeat("test()", setup="from __main__ import test"))
我有以下代码和结果。
测试 1 和 2 是相同的(至少我认为它们是相同的)但它们总是花费不同的时间 运行。
我的问题是:
- 我使用
timeit()
正确吗? - 在评估一种语法与另一种语法时,毫秒是否重要?
- 如果我没有做错什么,为什么会有不同?
timeit
是测试性能的正确方法还是有更好的方法?
代码:
import timeit
def test1(a="String1", b="String2", c="String3",
d="I took a heavenly ride through our silence "):
r = a + b + c + d
def test2(e="String1", f="String2", g="String3",
h="I took a heavenly ride through our silence "):
s = e + f + g + h
def test3(e="String1", f="String2", g="String3",
h="I took a heavenly ride through our silence "):
t = e.join([f,g,h])
if __name__ == '__main__':
reps = 10000000
print("Test 1")
print(timeit.timeit("test1()", number=reps,
setup="from __main__ import test1"))
print("Test 2")
print(timeit.timeit("test2()", number=reps,
setup="from __main__ import test2"))
print("Test 3")
print(timeit.timeit("test3()", number=reps,
setup="from __main__ import test3"))
print(" ")
print(" ")
print("Test 2")
print(timeit.timeit("test2()", number=reps,
setup="from __main__ import test2"))
print("Test 1")
print(timeit.timeit("test1()", number=reps,
setup="from __main__ import test1"))
print("Test 3")
print(timeit.timeit("test3()", number=reps,
setup="from __main__ import test3"))
结果:
Test 1
3.46861560261924
Test 2
3.4760945739099185
Test 3
6.51532737832723
Test 2
3.475778266347378
Test 1
3.465791808905923
Test 3
6.493744207694682
文档 link.
系统上的进程 运行 可能会干扰计时,因为 timeit 测量时钟时间,而不是 CPU 时间。
默认情况下,
timeit()
会在计时期间暂时关闭垃圾收集。这种方法的优点是它使独立计时更具可比性。这个缺点是GC可能是被测函数性能的重要组成部分。
重复调用timeit()
,
def test():
L = []
for i in range(10):
L.append(i)
if __name__ == '__main__':
import timeit
print(timeit.repeat("test()", setup="from __main__ import test"))