numba.jit 似乎对性能没有影响的情况

Case where numba.jit seems to have no effect on performance

我正在 运行 简单测试以了解 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 在这种情况下似乎没有任何效果。这是为什么?

正如您在文档中看到的,只有 += 操作可以优化:https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.normal.html#numpy.random.normal

对随机数生成器的调用有一个size,所以没有涵盖。

大部分时间可能已经由 numpy 以高效的方式完成,在这种情况下 numba 可以优化的不多。

不清楚为什么您认为应该有改进。我通过使用 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