我正在写一个jitted函数来用多维数组中的前N个元素替换0.我会做很多次,所以速度很重要。 @njit显着加快了速度,但我想知道是否有办法摆脱使用列表理解的for循环。这有助于提高效率吗?有什么建议吗?
import numpy as np
from numba import njit
lengths=np.random.randint(0,365, size=20)
@njit
def availarray(lengths):
out=1+np.zeros((365, len(lengths)))
for i in range(int(len(lengths))):
out[:int(lengths[i]), i]=0*int(lengths[i])
return out
答案 0 :(得分:1)
总结:摆脱对int
和len
的所有来电;摆脱乘以0;有效地生成原始数组。
def availarray(lengths):
out = np.ones((365, lengths.size))
for i in range(lengths.size):
out[:lengths[i], i] = 0
return out
这将执行时间从49 mks减少到31.7 mks。
从一个零数组开始并用1填充它会更好:
def availarray(lengths):
out = np.zeros((365, lengths.size))
for i in range(lengths.size):
out[lengths[i]:, i] = 1
return out
在我的情况下,这进一步将执行时间减少到26.3 mks,加速46%。