在我的机器上,d.clear()
和d={}
之间的执行速度超过100ns,所以很奇怪为什么会使用其中一个而不是另一个。
import timeit
def timing():
d = dict()
if __name__=='__main__':
t = timeit.Timer('timing()', 'from __main__ import timing')
print t.repeat()
答案 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()
是否会这样做,但是一个一个地删除所有密钥肯定会。