我正在尝试在一个非常简单的示例上测试 numba 和 numpy 并检查效率。然而,
在 numba 的情况下,使用 time.clock 和 timeit 我得到非常不同的结果。
在 time.clock 的情况下,它表明将 numba 与 numpy 一起使用会使函数变慢。
对 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))
最佳答案
你的基准有几个问题
- 在衡量性能之前,您必须调用每个函数一次。否则你就是在衡量编译开销
- 计时器不是那么精确,您必须多次运行每个函数
- 即使这样结果也可能不同,因为您的函数运行时间非常短,在这种情况下函数调用开销可能是个问题
- 您并没有真正衡量计算速度。内存分配是代码中成本最高的部分。内存分配的时间在很大程度上受到垃圾收集器和内核在基准时间必须做的其他事情的影响
关于更好的基准测试的建议
预先分配内存
创建运行时间更长的代码(增加 N)
在您的代码中进行更多计算(sin、cos、sqrt),在对简单乘法进行基准测试的情况下,您正在对 RAM 速度和缓存速度进行基准测试
看看 nb.njit(fastmath=True)
确保拥有最新的 Numba 版本并已安装 Intel SVML
关于python-3.x - 将 numba 与 time.clock() 和 timeit 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50038584/