Numba 0.35.0:使用 NumPy out 参数
Numba 0.35.0 : Use NumPy out parameter
我正在做一些测试以更好地了解 Numba 如何与 NumPy 一起工作,在这里我想看看 Numba 是否可以处理参数。
import numpy as np
from numba import njit , jit
from time import time
@njit
def mult(a,b, N = 1000000):
c = np.zeros_like(a)
for i in range(N):
np.multiply(a, b, out=c)
return c
d = np.asarray([1,2,3,4,5,6,7,8,9])
e = np.asarray([1,2,3,4,5,6,7,8,9])
t = time()
e = mult(d,e)
print "Time Elapsed :" + str(time() - t)
不使用 Numba,代码运行良好。它甚至比使用 @jit
装饰更快:~1.2s 对 ~1.6s 我的配置。
使用 @njit
会导致错误:
LoweringError: unsupported keyword arguments when calling Function(<ufunc 'multiply'>)
虽然,Reading the Numba 0.15.1 doc.,他们说支持 out 参数。我能做些什么呢?
只是nopython模式下的numba不支持关键字参数。如果您将它作为位置参数传递,它会起作用:
@njit
def mult(a,b, N = 1000000):
c = np.zeros_like(a)
for i in range(N):
np.multiply(a, b, c)
return c
然而,使用总是做同样事情的循环 可能是 numba 的一个问题,因为有时 numba 编译器会注意到结果在循环之间不会改变,它会完全优化循环 - 本质上导致错误的时间。但是在这种情况下,我认为这不会发生,但是在使用像 numba 这样的激进编译器并根据 "naive" Python 方法对其进行计时时需要小心。
我正在做一些测试以更好地了解 Numba 如何与 NumPy 一起工作,在这里我想看看 Numba 是否可以处理参数。
import numpy as np
from numba import njit , jit
from time import time
@njit
def mult(a,b, N = 1000000):
c = np.zeros_like(a)
for i in range(N):
np.multiply(a, b, out=c)
return c
d = np.asarray([1,2,3,4,5,6,7,8,9])
e = np.asarray([1,2,3,4,5,6,7,8,9])
t = time()
e = mult(d,e)
print "Time Elapsed :" + str(time() - t)
不使用 Numba,代码运行良好。它甚至比使用 @jit
装饰更快:~1.2s 对 ~1.6s 我的配置。
使用 @njit
会导致错误:
LoweringError: unsupported keyword arguments when calling Function(<ufunc 'multiply'>)
虽然,Reading the Numba 0.15.1 doc.,他们说支持 out 参数。我能做些什么呢?
只是nopython模式下的numba不支持关键字参数。如果您将它作为位置参数传递,它会起作用:
@njit
def mult(a,b, N = 1000000):
c = np.zeros_like(a)
for i in range(N):
np.multiply(a, b, c)
return c
然而,使用总是做同样事情的循环 可能是 numba 的一个问题,因为有时 numba 编译器会注意到结果在循环之间不会改变,它会完全优化循环 - 本质上导致错误的时间。但是在这种情况下,我认为这不会发生,但是在使用像 numba 这样的激进编译器并根据 "naive" Python 方法对其进行计时时需要小心。