我有以下for循环来构造值列表:
p = 7
A = []
for i in range(0, 10**p):
A.append(i**3 + i**2)
为了加快列表的创建,我使用矢量化方法将其创建为Numpy数组。这种方法比等效的for循环快得多,特别是对于p
的大值,这会增加范围。
import numpy as np
from numba import autojit
p = 7
m = np.arange(0, 10**p)
D = np.empty(len(m))
D = m**3 + m**2
为了进一步加快阵列的创建,我想我会尝试使用Numba包。以下是我目前的尝试。
@autojit
def func(a):
a = np.asarray(a)
n = np.arange(0, 10**p)
a = np.append(a, n**3 + n**2)
return a
e = []
E = func(e)
不幸的是,我没有看到使用Numba的性能提升,这比使用Numpy的矢量化方法慢了近3倍。
有关如何使用Numba的任何建议吗?
答案 0 :(得分:6)
Numba没有更快地进行任意方法调用。如果你打电话给图书馆,numba在大多数情况下都无法做任何事情。但是如果你重新写一些东西,你仍然可以得到一个不错的加速(我使用numba 0.14.0 - 如果你使用不同的版本,硬件等,你可能得到不同的结果,尤其是因为numba正在积极发展中):
import numpy as np
import numba as nb
def func(a, p):
a = np.asarray(a)
n = np.arange(0, 10**p)
a = np.append(a, n**3 + n**2)
return a
@nb.jit
def func2(a, p):
a = np.asarray(a)
n = np.empty(10**p, dtype=np.float64)
for k in range(10**p):
n[k] = k*k*(k + 1)
return np.append(a, n)
p = 6
e = []
E = func(e, p)
E2 = func2(e, p)
print np.allclose(E, E2)
和时间:
In [51]:
%timeit func(e, p)
10 loops, best of 3: 42.9 ms per loop
In [52]:
%timeit func2(e, p)
100 loops, best of 3: 3.09 ms per loop
对于p=7
,你需要对数值精度有点小心。
使用numba的关键是展开循环,只制作" primitive" numba支持的算术调用