我有一个形状A == 0
的二维列表,其中每个子列表都有不同的大小。为了将数据转换为Tensor,所有子列表都需要具有相同的长度,但我不想丢失转换中的子列表中的任何数据。
这意味着我需要使用填充符(A == 1
)填充小于最长子列表的所有子列表,以便创建矩形数组。对于我当前的数据集,最长的子列表长度为5037。
我的转换代码如下:
(300,000, X)
但是,当-1
中有300,000个序列,且for seq in new_format:
for i in range(0, length-len(seq)):
seq.append(-1)
通常> 4000时,此过程非常慢。如何有效加快此过程或解决问题?
答案 0 :(得分:1)
单个append
调用可能相当慢,因此使用list
乘法一次创建整个填充值,然后立即将其连接起来,例如:
for seq in new_format:
seq += [-1] * (length-len(seq))
seq.extend([-1] * (length-len(seq)))
将是等效的(由于广义的方法调用方法,通常较慢,但考虑到实际工作的大小,可能无法察觉)。
理论上,seq.extend(itertools.repeat(-1, length-len(seq)))
可以避免潜在的大临时值,但是IIRC,list.__iadd__
/ list.extend
的实际CPython实现强制创建一个临时的list
(处理根据被扩展的list
定义生成器的情况,因此它实际上不会避免临时。