使用numba与time.clock()和timeit

时间:2018-04-26 08:43:36

标签: python-3.x numpy numba

我试图在一个非常简单的例子上测试numba和numpy并检查效率。但是,

  1. 使用time.clock和timeit我的numba有非常不同的结果。

  2. 在time.clock的情况下,它显示使用带有numpy的numba会使函数变慢。

  3. 对NbNpFunc使用vectorize()是否有意义?

  4. 这是我的代码。谢谢您的帮助。

    import numpy as np
    from numba import jit
    import time
    import timeit
    #import math
    #import matplotlib.pyplot as plt
    #import matplotlib.animation as animation
    
    N = 10000
    
    def PyFunc(N):
        r = list(range(0,N)) 
        for i in range(0,len(r)):
                r[i] += r[i]*r[i]
        return(r)
    
    def NpFunc(N):
        r = np.arange(0,N)
        r += r*r
        return(r)
    
    @jit
    def NbFunc(N):
        r = list(range(0,N))
        for i in range(0,len(r)):
            r[i] += r[i]*r[i]
        return(r)
    
    @jit
    def NbNpFunc(N):
        r = np.arange(0,N) 
        r += r*r
        return(r)
    
    print("\nUsing time.clock()")
    start_time = time.clock()
    res1 = PyFunc(N)
    print("PyFunc --- %s seconds ---"  %(time.clock() - start_time))    
    start_time = time.clock()
    res2 = NpFunc(N)
    print("NumPyFunc --- %s seconds ---" % (time.clock() - start_time))    
    start_time = time.clock()
    res3 = NbFunc(N)
    print("NumbaFunc --- %s seconds ---" % (time.clock() - start_time))    
    start_time = time.clock()
    res4 = NbNpFunc(N)
    print("NumbaNpFunc --- %s seconds ---" % (time.clock() - start_time))    
    
    print("\nUsing timeit")
    t = timeit.Timer(lambda: PyFunc(N))
    print ("PyFunc --- %s seconds ---" %t.timeit(number=1))
    t = timeit.Timer(lambda: NpFunc(N))
    print ("NumPyFunc --- %s seconds ---" %t.timeit(number=1))
    t = timeit.Timer(lambda: NbFunc(N))
    print ("NumbaFunc --- %s seconds ---" %t.timeit(number=1))
    t = timeit.Timer(lambda: NbNpFunc(N))
    print ("NumbaNpFunc --- %s seconds ---" %t.timeit(number=1))
    

1 个答案:

答案 0 :(得分:1)

您的基准测试有几个问题

  • 在测量性能之前,您必须调用每个函数一次。否则,您正在测量编译开销
  • 定时器不是那么精确,你必须多次运行每个功能
  • 即使这样结果可能会有所不同,因为你的运行功能很短,在这种情况下,函数调用开销可能会有问题
  • 你真的没有测量计算速度。内存分配是代码中成本最高的部分。内存分配的时间受垃圾收集器和内核在基准时间必须做的其他事情的影响很大

提出更好的基准测试建议

  • 分配内存bevorehand

  • 创建一个运行时间更长的代码(增加N)

  • 在您的代码(sin,cos,sqrt)中进行更多计算,如果对简单乘法进行基准测试,则需要对RAM速度和缓存速度进行基准测试

  • 看看nb.njit(fastmath = True)

  • 确保拥有最新的Numba版本并已安装Intel SVML