这是使用timeit模块的正确方法吗?

时间:2017-08-27 02:39:00

标签: python performance timeit

我有以下代码和结果。

测试1和2是相同的(至少我认为它们是相同的),但它们总是花费不同的时间来运行。

我的问题是:

  1. 我正确使用timeit()吗?
  2. 在评估一种语法与另一种语法时,毫秒是否重要?
  3. 如果我没有做错什么,为什么会有差异?
  4. timeit是测试效果的正确方法还是有更好的方法?
  5. 代码:

    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
    

1 个答案:

答案 0 :(得分:1)

文档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"))