我正在运行简单的测试,以查看numba.jit如何有效地提高numpy数组的循环功能的速度。但是,在这两个示例中:
def f():
a=np.ones(1000)
for i in range(100000):
a+=np.random.normal(0,1,1000)
%time f()
和
from numba import jit
@jit
def g():
a=np.ones(1000)
for i in range(100000):
a+=np.random.normal(0,1,1000)
%time g()
我得到:
因此numba.jit在这种情况下似乎没有任何作用。为什么会这样?
答案 0 :(得分:1)
尚不清楚为什么,您认为应该有所改进。我看到通过添加带有numba
的内部循环而得到了改善,这可能是 的原因,因为JIT编译可以优化具有更多基本,较低级别类型的操作。
# python 3.6.0, numpy 1.11.3, numba 0.30.1
np.random.seed(0)
def f(m, n):
a = np.ones(n)
for i in range(m):
a += np.random.normal(0,1,n)
return a
@jit
def g(m, n):
a = np.ones(n)
for i in range(m):
x = np.random.normal(0,1,n)
for j in range(n):
a[j] += x[j]
return a
%timeit f(10**5, 10**3) # 6.53 s per loop
%timeit g(10**5, 10**3) # 4.68 s per loop
答案 1 :(得分:0)
您可以在文档中看到,只有+ =操作可以优化:https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.normal.html#numpy.random.normal
对随机数生成器的调用有一个size
,因此不包括在内。
大多数时候,numpy可能已经以一种有效的方式完成了该操作,在这种情况下,没有多少numba可以优化。