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

时间:2018-11-30 16:57:06

标签: python numpy numba

我正在运行简单的测试,以查看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()

我得到:

  • CPU时间:用户3.75 s,sys:0 ns,总计:3.75 s 挂墙时间:3.75 s
  • CPU时间:用户3.86 s,sys:4.11 ms,总计:3.86 s 挂墙时间:3.84 s

因此numba.jit在这种情况下似乎没有任何作用。为什么会这样?

2 个答案:

答案 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可以优化。