我正在遍历超过三百万个项目的列表,并为它们分配整数值。对于组织,我创建了一个字典,其键是整数,值是具有该分数的项目列表。先验,我不知道有多少项会有一定的分数,所以我使用+运算符追加到列表中,如下所示:
for e in xs:
myDict[val(e)] = myDict.get(val,[]) + [e]
我的问题是:
答案 0 :(得分:3)
使用append
:
for e in xs:
myDict.setdefault(val(e), []).append(e)
这样可以避免每次都建立一个新列表。操作list1
+ list2
需要在每次迭代中构建新列表,从而分配内存。 append
效率更高,因为列表最后是预先分配的内存。例如,构建一个从空列表开始追加到包含1000万个条目的列表的列表需要多于100个内存分配。
如果密钥存在,setdefault字典方法将返回相应的值。如果密钥不在字典中,则返回默认值。在这种情况下,默认值是列表。由于列表的可变性,我们可以在每个后续迭代中附加到第一个和部分填充列表中的空列表。
使用setdefault()
的替代方法是collections.defaultdict。做一些分析,找出哪一个更快。