首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高效的2d列表初始化[python]

高效的2d列表初始化[python]
EN

Stack Overflow用户
提问于 2020-05-21 13:38:41
回答 2查看 368关注 0票数 0

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

Best and/or fastest way to create lists in python

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

代码语言:javascript
复制
import time
t1 = time.time()
matrix = [[0]*5000]*5000
t2 = time.time()

t2-t1

0.0

但是在做了一些操作之后,我意识到每次我更改/追加一个元素时,效果都会应用到所有的子列表中,这意味着每个列表只是一个引用,这对于一个真实的场景来说是行不通的,尽管它很快。

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

现在,很明显,大多数其他的2d/多模糊列表初始化答案都表明了列表的理解性,

代码语言:javascript
复制
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列表?

让我知道,如果有重复,到目前为止,我没有发现任何显示时间比较的方法之间的多维列表初始化。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-07 08:22:37

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

但这一点:

代码语言:javascript
复制
[[0] * 5000 for i in range(5000)]

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

票数 2
EN

Stack Overflow用户

发布于 2020-05-21 14:52:07

我发现了一种方法,它比执行理解列表要快,但仍然比执行matrix=[[0]*5000]*5000慢得多。我不是专家,但我怀疑您的方法太快了,因为它并不是真正创建大小为5000x5000的列表,而是创建一个大小为5000的列表并重复它,正如您注意到的那样。

您的方法在我的计算机中需要2.098e-5秒。我的方法在我的计算机中需要0.1236秒(可能我的方法在您的计算机中花费的时间更长,所以它可能会更慢)。

代码语言:javascript
复制
mat = []
[mat.append([0]*5000) for i in range(5000)]

你可以试试,也许它能缓解你的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61935823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档