4

在我的机器上,执行速度介于d.clear()和之间,d={}超过 100ns,所以我很好奇为什么一个人会使用另一个。

import timeit

def timing():
    d = dict()

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

2 回答 2

19

不同之处在于d = {}创建一个新字典并d.clear()清空您已有的字典。如果您的代码中有其他地方包含对您的字典的引用,那么这种细微的差异很重要。在第一种情况下,其他对象不会看到任何变化,因为您没有修改原始字典。以下代码显示了这种操作差异。

创建一个新字典:

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

清除现有字典:

>>> d = {'foo': 'bar'}
>>> d2 = d
>>> d.clear()
>>> d2
{}
于 2010-04-28T19:33:39.617 回答
6

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

d.clear()清除字典。

如果你使用d={},那么任何指向的东西d都会指向旧的d。这可能会引入一个错误。

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

另外,我认为d.clear()(在 CPython 中)不会释放d. 出于性能考虑,当您删除元素时,CPython不会从字典中占用内存,因为字典的通常用途是构建一个大字典,并且可能会删除一些元素。在大多数用例中,重新分配内存(并确保哈希表保持一致)会花费很长时间。相反,它用(这是邮件列表上的技术术语)填充字典turds,这表明一个元素曾经在那里,但后来被删除了。我不完全确定是否d.clear()这样做,但肯定会一一删除所有键。

于 2010-04-29T02:46:17.747 回答