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()
我得到:
- CPU 次:用户 3.75 秒,系统:0 纳秒,总计:3.75 秒
挂墙时间:3.75 秒
- CPU 次:用户 3.86 秒,系统:4.11 毫秒,总计:3.86 秒
挂墙时间:3.84 秒
所以 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
我正在 运行 简单测试以了解 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 秒,系统:0 纳秒,总计:3.75 秒 挂墙时间:3.75 秒
- CPU 次:用户 3.86 秒,系统:4.11 毫秒,总计:3.86 秒 挂墙时间:3.84 秒
所以 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