Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
列表与字典在python中存储零_Python_List_Dictionary - Fatal编程技术网

列表与字典在python中存储零

列表与字典在python中存储零,python,list,dictionary,Python,List,Dictionary,我正在解决一个问题,在这个问题中,我需要一个零列表,然后我必须更新列表中的一些值。现在我脑子里有两个选择,第一个方法是简单地列出一个零,然后更新值,或者创建一个字典,然后更新值 列表方法: l=[0]*n d={} for i in range(n): d[i]=0 字典方法: l=[0]*n d={} for i in range(n): d[i]=0 现在,构建字典的复杂性是O(n),然后更新密钥是O(1)。但我不知道python如何使用上述方法构建零列表 让我们假设

我正在解决一个问题,在这个问题中,我需要一个零列表,然后我必须更新列表中的一些值。现在我脑子里有两个选择,第一个方法是简单地列出一个零,然后更新值,或者创建一个字典,然后更新值

列表方法:

l=[0]*n
d={}
for i in range(n):
    d[i]=0
字典方法:

l=[0]*n
d={}
for i in range(n):
    d[i]=0
现在,构建字典的复杂性是
O(n)
,然后更新密钥是
O(1)
。但我不知道python如何使用上述方法构建零列表


让我们假设n是一个很大的数字,上面哪种方法更适合此任务?列表方法是如何在python中实现的。另外,为什么上面的列表方法比列表理解方法更快地创建零列表?

预先分配序列后的访问和更新将大致相同

选择适合您的应用程序的数据结构。在这种情况下,我建议使用一个列表,因为它更自然地符合“按整数索引的序列”


[0]*n之所以快速,是因为它可以一次生成正确大小的列表,而不是随着添加更多元素而不断扩展列表

使用
timeit
运行测试后:

import timeit
timeit.repeat("[0]*1000", number=1000000)
#[4.489016328923801, 4.459866205812087, 4.477892545204176]

timeit.repeat("""d={}
for i in range(1000):
d[i]=0""", number=1000000)
#[77.77789647192793, 77.88324065372811, 77.7300221235187]

timeit.repeat("""x={};x.fromkeys(range(1000),0)""", number=1000000)
#[53.62738158027423, 53.87422525293914, 53.50821399216625]

正如您所看到的,这两种方法之间存在巨大的差异,第三种方法更好,但不是列表!原因是创建一个指定大小的
列表
比创建一个
字典
并在迭代中扩展它要快得多。

我认为在这种情况下,你应该只使用列表,除非你想访问一些数据而不使用索引

Python列表是一个数组。它使用特定的大小进行初始化,当它需要存储超过其大小所能容纳的项目时,它只是将所有内容复制到一个新数组中,复制为O(k),其中k是列表的大小。这个过程可能会发生很多次,直到列表的大小大于或等于n。但是,[0]*n只会创建具有正确大小(即n)的数组,因此它比从一开始就将列表更新为正确大小要快

对于通过列表理解创建,如果您的意思类似于
[0 For i in range(n)]
,我认为它会受到更新列表大小的影响,因此速度较慢


Python dictionary是哈希表的一个实现,它使用哈希函数在插入新的键值对时计算键的哈希值。哈希函数本身的执行成本相对较高,字典还处理诸如冲突之类的其他情况,这使得它的执行速度更慢。因此,从理论上讲,按字典创建0应该是最慢的。

集合。如果您希望在保持初始值的更新过程中许多元素不会发生更改(并且如果您不以某种方式依赖
KeyError
),则defaultdict可能是更好的解决方案。只是

另一个要考虑的事情是:代码>数组。数组< /COD>。如果只想存储一种类型的元素(计数),可以使用它。它应该比列表快一点,内存效率高一点:

import array
l = array.array('L', [0]) * n
# use as list

我建议您做一些实验,打印运行时间并查看自身差异。字典初始化更好,因为:
dict.fromkeys(range(n),0)
l=[0]*n
只做
l=list.\uu mul([0],n)
但使用语言构造。序列类型通常实现用于重复它们的
\uuuuuu mul\uuuuu
。请尝试:python-mtimeit-s'x={}''x.fromkeys(范围(1000),0)'