我在写一个图的邻接矩阵的代码,发现了这个问题。
所以,我干脆写了这个来初始化我的邻接矩阵,因为目前看来这是初始化列表最快的方法。
import time
t1 = time.time()
matrix = [[0]*5000]*5000
t2 = time.time()
t2-t1
0.0
但是在做了一些操作之后,我发现每次改变appended一个元素的时候,效果都会应用到所有的子列表上,也就是说每个列表都只是一个引用,这样做虽然速度很快,但是对于实际的场景是行不通的。
我不能使用 numpy
,因为算法网站不允许外部模块库。我认为 numpy
会是一般情况下的理想解决方案。
现在,显然其他大多数2dmulti-dim列表初始化的答案都建议列表理解。
import time
t1 = time.time()
matrix = [[0 for i in range(5000)] for j in range(5000)]
t2 = time.time()
print(t2-t1)
0.7021145820617676
但是,考虑到在算法网站中解决一个图问题的严格时间限制,似乎很慢(与其他语言相比)。
有没有更快的方法在python中初始化一个2d3d列表?
如果有重复的,请告诉我,到目前为止,我没有找到任何显示多维列表初始化的方法之间的一些时间比较。
问题来自于列表的第二层。[0] * 5000
因为它建立了一个由不可改变的值组成的列表。因此,如果你改变了列表中的一个值,你实际上会替换它。但由于列表是可变的,你不能用这种方法来建立一个列表的列表。
但是这个。
[[0] * 5000 for i in range(5000)]
仍然是正确的。它建立了5000个不同的(不可变的)数字列表,所以它将允许你改变任何单个元素,而不会产生不必要的副作用。而且它比你现在的代码更有效率。
我找到了一个方法,它比做你的理解列表要快,但还是比做 matrix=[[0]*5000]*5000
. 我不是专家,但我怀疑你的方法之所以如此之快,是因为它并没有真正创建一个大小为5000x5000的列表,而是创建了一个大小为5000的列表并重复执行,正如你所注意到的。
你的方法在我的电脑上需要2.098e-5秒。我的方法在我的电脑上需要0.1236秒(有可能我的方法在你的电脑上需要的时间更长,所以可能更慢)。
mat = []
[mat.append([0]*5000) for i in range(5000)]
你可以试试,也许能减轻你的问题。