首页 > 解决方案 > 高效的二维列表初始化 [python]

问题描述

我正在为图形的邻接矩阵编写代码并发现了这个问题:

在 python 中创建列表的最佳和/或最快方法

所以,我只是写了这个来初始化我的邻接矩阵,因为它似乎是迄今为止初始化列表的最快方法。

import time
t1 = time.time()
matrix = [[0]*5000]*5000
t2 = time.time()

t2-t1

0.0

但是在做了一些操作之后,我意识到每次更改/附加一个元素时,效果都会应用于所有子列表,这意味着每个列表只是一个参考,即使速度很快,这也不适用于真实场景。

我不能使用numpy,因为算法站点不允许外部模块/库。我认为numpy这将是一般情况下的理想解决方案。

现在,显然大多数其他 2d/multi-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 中初始化 2d/3d 列表?

让我知道是否有重复,到目前为止我没有找到任何显示多维列表初始化方法之间的时间比较的东西。

标签: python-3.xlistmultidimensional-array

解决方案


问题来自第二级列表。[0] * 5000很好,因为它构建了一个不可变值的列表。因此,如果您更改该列表中的值,您实际上将替换它。但是由于列表是可变的,您不能使用该方法来构建列表列表。

但是这个:

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

仍然是正确的。它构建了 5000 个不同的(不可变的)数字列表,因此它允许您更改任何单个元素而不会产生不必要的副作用。而且它比您当前的代码效率更高。


推荐阅读