我试图在一个非常简单的例子上测试numba和numpy并检查效率。但是,
使用time.clock和timeit我的numba有非常不同的结果。
在time.clock的情况下,它显示使用带有numpy的numba会使函数变慢。
对NbNpFunc使用vectorize()是否有意义?
这是我的代码。谢谢您的帮助。
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))
答案 0 :(得分:1)
提出更好的基准测试建议
分配内存bevorehand
创建一个运行时间更长的代码(增加N)
在您的代码(sin,cos,sqrt)中进行更多计算,如果对简单乘法进行基准测试,则需要对RAM速度和缓存速度进行基准测试
看看nb.njit(fastmath = True)
确保拥有最新的Numba版本并已安装Intel SVML