“d.clear()”和“d = {}”之间的区别

时间:2010-04-28 19:30:42

标签: python timing

在我的机器上,d.clear()d={}之间的执行速度超过100ns,所以很奇怪为什么会使用其中一个而不是另一个。

import timeit

def timing():
    d = dict()

if __name__=='__main__':
    t = timeit.Timer('timing()', 'from __main__ import timing')
    print t.repeat()

2 个答案:

答案 0 :(得分:19)

不同之处在于d = {}创建了一个新词典,而d.clear()只会清空您已有的词典。如果您的代码中有其他位置包含对词典的引用,则这种细微差别很重要。在第一种情况下,由于您尚未修改原始字典,因此其他对象将看不到任何更改。以下代码显示了这种差异。

创建新词典:

>>> d = {'foo': 'bar'}
>>> d2 = d
>>> d = {}
>>> d2
{'foo': 'bar'}

清除现有词典:

>>> d = {'foo': 'bar'}
>>> d2 = d
>>> d.clear()
>>> d2
{}

答案 1 :(得分:6)

d={}创建一个新词典。

d.clear()清除字典。

如果您使用d={},则指向d的任何内容都将指向旧的d。这可能会引入一个错误。

如果您使用d.clear(),那么任何指向d的内容现在都会指向已清除的字典,如果这不是您想要的,也可能会引入错误。

此外,我认为d.clear()(在CPython中)不会释放d占用的内存。为了提高性能,当删除元素时,CPython 不会从字典中删除内存,因为字典的常用用法是构建一个大字典,可能修剪一些字典元素。重新分配内存(并确保哈希表保持一致)在大多数用例中花费的时间太长。相反,它用turds(这是邮件列表中的技术术语)填充字典,这表明过去的元素已被删除。我不完全确定d.clear()是否会这样做,但是一个一个地删除所有密钥肯定会。