Numba官网:http://numba.pydata.org/。
Numba对for循环处理Numpy数组有很大的加速效果,推荐使用。但Numba支持的函数有限,同时也容易产生错误,因此需要谨慎调用,多做测试。
简单的使用方法(在函数前增加@jit):
from numba import jit
@jit
def f(x):
return x**2
一个for循环的测试例子:
import numpy as np
from numba import jit
import time
def for_sum(numpy_array):
sum = 0
for number in numpy_array:
sum += number
return sum
@jit
def numba_for_sum(numpy_array):
sum = 0
for number in numpy_array:
sum += number
return sum
numpy_array = np.arange(0,1e8,1)
start = time.time()
result = sum(numpy_array)
end = time.time()
print('\nresult:', result)
print('python中sum()函数求和时间:\n', end - start)
start = time.time()
result = np.sum(numpy_array)
end = time.time()
print('\nresult:', result)
print('numpy.sum()函数求和时间:\n', end - start)
start = time.time()
result = for_sum(numpy_array)
end = time.time()
print('\nresult:', result)
print('for循环求和numpy数组的时间:\n', end - start)
start = time.time()
result = numba_for_sum(numpy_array)
end = time.time()
print('\nresult:', result)
print('numba加速for循环求和numpy数组的时间:\n', end - start, '\n')
运行结果:
result: 4999999950000000.0
python中sum()函数求和时间:
11.673642873764038
result: 4999999950000000.0
numpy.sum()函数求和时间:
0.12153196334838867
result: 4999999950000000.0
for循环求和numpy数组的时间:
15.565314054489136
result: 4999999950000000.0
numba加速for循环求和numpy数组的时间:
0.28093886375427246
对于求和的过程明显可以直接使用numpy.sum(),但Numba加速可适用于普遍的for循环处理Numpy数组的情况。在实际应用中,Numba是否能起到有效加速需要做具体的代码测试和时间测试,同时也可查阅官方的文档说明。
另外一个例子:
(1)这样写会报错:
@jit
def numba_for_sum():
sum = 0
for i0 in range(2):
sum = sum + np.array([1, 2])
(2)这样写是运行正确:
@jit
def numba_for_sum():
sum = np.zeros(2)
for i0 in range(2):
sum = sum + np.array([1, 2])
(3)而在这种没有循环的情况下,数组的广播能力又恢复了,不会报错:
@jit
def numba_for_sum():
sum = 0
sum = sum + np.array([1, 2])
这应该跟numba的运行机制有关,得一步步代码做测试。如果直接把原先的代码加一个@jit,大概率会出问题。
参考资料:
[3] numba从入门到精通(1)—为什么numba能够加速
【说明:本站主要是个人的一些笔记和代码分享,内容可能会不定期修改。为了使全网显示的始终是最新版本,这里的文章未经同意请勿转载。引用请注明出处:https://www.guanjihuan.com】