Python Numba autojit函数比矢量化Numpy方法慢

Python Numba autojit函数比矢量化Numpy方法慢,python,python-3.x,numpy,jit,numba,Python,Python 3.x,Numpy,Jit,Numba,我使用以下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

我使用以下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的建议?

Numba不会使任意方法调用更快。如果你在图书馆打电话,numba在大部分时间里真的什么都做不了。但是,如果您重新编写一些不同的东西,您仍然可以获得相当好的加速(我使用的是numba 0.14.0——如果您使用的是不同的版本、硬件等,您可能会得到不同的结果,特别是因为numba正在进行开发):

和时间:

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的关键是展开循环,只进行numba支持的“基本”算术调用

numpy函数已经矢量化,使用
@autojit
将大大改变
for
的方法loop@SaulloCastro你是说用autojit将的
包装成一个函数?你能用这种方法提交一个答案并比较时间吗?我的答案与JoshAdels的类似,重点是在使用Numba时用Fortran编写,只是提醒这里的索引从0开始:)你的
func2
的速度增加是由于
k*k*(k+1)
而不必使用
nb.jit
。如果在
func
中将
n**3+n**2
更改为
n*n*(n+1)
,那么它仍然比numba方法快。在我的机器上,
n*n*(n+1)
仍然比numba慢2倍。实际上,我对此有点惊讶,因为我以为会创建类似级别的临时数组,但我猜
**
操作符的代码路径一定有点不同。可能我的代码还有其他问题。这是我运行@Gavin的文件,我猜你只对numba函数计时一次,因此时间包括对代码的jit,而当我使用
timeit
时,我从一个温暖的开始中获得了最佳时间。啊哈,你说得对!我得到的时间是从一个寒冷的开始。使用
timeit
函数,我得到了更快的Numba方法。那么有没有办法保存“jit-ed”代码呢?例如:当启动一个新的Python实例时,我只需运行已经“jit-ed”的代码,而不必经历“预热”过程。
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