高效的二维列表初始化[python]。

问题描述 投票:0回答:1

我在写一个图的邻接矩阵的代码,发现了这个问题。

在python中创建列表的最佳和最快的方法是什么?

所以,我干脆写了这个来初始化我的邻接矩阵,因为目前看来这是初始化列表最快的方法。

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列表?

如果有重复的,请告诉我,到目前为止,我没有找到任何显示多维列表初始化的方法之间的一些时间比较。

python-3.x list multidimensional-array
1个回答
2
投票

问题来自于列表的第二层。[0] * 5000 因为它建立了一个由不可改变的值组成的列表。因此,如果你改变了列表中的一个值,你实际上会替换它。但由于列表是可变的,你不能用这种方法来建立一个列表的列表。

但是这个。

[[0] * 5000 for i in range(5000)]

仍然是正确的。它建立了5000个不同的(不可变的)数字列表,所以它将允许你改变任何单个元素,而不会产生不必要的副作用。而且它比你现在的代码更有效率。


0
投票

我找到了一个方法,它比做你的理解列表要快,但还是比做 matrix=[[0]*5000]*5000. 我不是专家,但我怀疑你的方法之所以如此之快,是因为它并没有真正创建一个大小为5000x5000的列表,而是创建了一个大小为5000的列表并重复执行,正如你所注意到的。

你的方法在我的电脑上需要2.098e-5秒。我的方法在我的电脑上需要0.1236秒(有可能我的方法在你的电脑上需要的时间更长,所以可能更慢)。

mat = []
[mat.append([0]*5000) for i in range(5000)]

你可以试试,也许能减轻你的问题。

© www.soinside.com 2019 - 2024. All rights reserved.