gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:30:31 25 4
gpt4 key购买 nike

我有以下 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正在积极开发中):

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

关于python - Numba autojit 函数比矢量化 Numpy 方法慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26366978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com