【发布时间】:2020-07-20 03:57:57
【问题描述】:
我意识到for 循环通常与Python 相比很慢。我有一些代码弄乱了一些张量:
for batch_index, mask_batch in enumerate(mask):
mask_len = torch.sum(mask_batch).int()
if mask_len == 0:
side_input = torch.zeros((max_inp_len, side_input.shape[1])).to(mask.device)
else:
m_nonzero = mask_batch.nonzero().flatten()
first_nonzero = m_nonzero[0]
last_nonzero = m_nonzero[-1]
if side == 'left':
end_index = first_nonzero - 1
start_index = 0
elif side == 'right':
start_index = last_nonzero + 1
end_index = inputs[batch_index].size(1)
side_input = inputs[batch_index][start_index:end_index]
if end_index - start_index < max_inp_len:
pad_zeros = torch.zeros(
(max_inp_len - side_input.shape[0], side_input.shape[1])).to(mask.device)
if side == 'left':
side_input = torch.cat((pad_zeros, side_input), 0)
elif side == 'right':
side_input = torch.cat((side_input, pad_zeros), 0)
side_inputs.append(side_input)
return torch.stack(side_inputs)
我觉得这个循环真的让事情变慢了。有什么方法可以让我在没有循环的情况下做到这一点?
【问题讨论】:
-
for 循环不是“慢”吗……你怎么能这么说?无论如何,如果您在循环中执行许多慢速操作,请考虑使用
threading或multiprocessing库。 -
如果你的 for 循环包括遍历一个张量,并对张量的元素执行一些操作,你应该尝试向量化这些操作。
-
会不会因为你在累积梯度而变慢?如果你把
with torch.no_grad()放在你所有的代码前面呢?
标签: python arrays numpy pytorch tensor