我在为图的邻接矩阵编写代码时发现了这个问题:
Best and/or fastest way to create lists in python
所以,我只是写了这个来初始化我的邻接矩阵,因为它似乎是迄今为止初始化列表最快的方法。
import time
t1 = time.time()
matrix = [[0]*5000]*5000
t2 = time.time()t2-t1
0.0
但是在做了一些操作之后,我意识到每次我更改/追加一个元素时,效果都会应用到所有的子列表中,这意味着每个列表只是一个引用,这对于一个真实的场景来说是行不通的,尽管它很快。
我不能使用numpy,因为算法站点不允许外部模块/库。我认为numpy将是一般情况下的理想解决方案。
现在,很明显,大多数其他的2d/多模糊列表初始化答案都表明了列表的理解性,
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中的2d/3d列表?
让我知道,如果有重复,到目前为止,我没有发现任何显示时间比较的方法之间的多维列表初始化。
发布于 2020-06-07 08:22:37
这个问题来自于第二个层次的列表。[0] * 5000很好,因为is构建了一个不可变值的列表。因此,如果您更改了该列表中的一个值,您将实际替换它。但是,由于列表是可变的,所以不能使用该方法生成列表列表。
但这一点:
[[0] * 5000 for i in range(5000)]仍然是正确的。它构建了5000种不同的(不可变)数字列表,因此它将允许您更改任何单独的元素,而不会产生不必要的副作用。而且它比当前代码高效得多。
发布于 2020-05-21 14:52:07
我发现了一种方法,它比执行理解列表要快,但仍然比执行matrix=[[0]*5000]*5000慢得多。我不是专家,但我怀疑您的方法太快了,因为它并不是真正创建大小为5000x5000的列表,而是创建一个大小为5000的列表并重复它,正如您注意到的那样。
您的方法在我的计算机中需要2.098e-5秒。我的方法在我的计算机中需要0.1236秒(可能我的方法在您的计算机中花费的时间更长,所以它可能会更慢)。
mat = []
[mat.append([0]*5000) for i in range(5000)]你可以试试,也许它能缓解你的问题。
https://stackoverflow.com/questions/61935823
复制相似问题