"d = dict()" 和 "d = {}" 的区别是什么?

37
$ python2.7 -m timeit 'd={}'
10000000 loops, best of 3: 0.0331 usec per loop
$ python2.7 -m timeit 'd=dict()'
1000000 loops, best of 3: 0.19 usec per loop

为什么要使用其中之一而不是另一个?

5个回答

60
我是那些喜欢用单词而不是标点符号的人之一,这也是我选择Python而不是Perl的原因之一。毕竟,“没有大括号的生活更美好”(一个旧的Python口号,带有一个微笑的少年卡通图案;-),当然(最初是指缩进与大括号用于分组,但大括号就是大括号!-)。
为了使用清晰、易读的短语而“付出”几个纳秒(这主要是内置名称空间查找的代价,每次使用内置类型或函数时都要付出代价,你可以通过将某些查找提前到循环外轻微地进行优化)是可以接受的。
因此,我的一般做法是,用dict()替代{},用list(L)替代L[:],以及用list()替代[],用tuple()替代()等等——只是一种偏好可发音的代码风格。当我在一个已有代码库上工作时,该代码库使用不同的风格,或者当我在一个新项目中与队友们有不同的强烈偏好时,我当然可以接受(在队友的情况下,我会尝试一些传教工作,呵呵).

1
将一些查找提升出循环 - 这是什么意思? - tshepang
10
比如说,可以使用一些基本的 Python 技巧来优化循环,特别是当循环被证明(通过性能测试)成为程序瓶颈时。例如,将 for i in x: f(dict()) 这样的代码(会对名字 dict 进行 len(x) 次查找)优化为在循环外部绑定一个本地的 d=dict,然后在循环中使用 for i in x: f(d()),这样就可以进行更快速的本地查找了。请注意,在翻译过程中不要改变原文的含义,并尽可能使翻译易于理解。 - Alex Martelli
1
顺便提一下(当然,与这个问题无关),Unladen Swallow 应该使这种习惯用法(d=dict)变得不必要 :) - rbp
@AlexMartelli s=str()s='' 有什么区别? - tshepang
除了可读性之外,我还不喜欢没有空集的 {} 习惯用法,因此存在一种不舒适的不对称性。对于空集合,你有 [] 表示 list(){} 表示 dict(),甚至 () 表示 tuple(),但是却没有类似于 set() 的东西。 - André C. Andersen
显示剩余2条评论

24

d=dict() 需要在 locals(),之后是globals(),最后是__builtins__中查找,而d={}则不需要。


不是的,dict__builtin__ 中。 - Mike Graham
@MikeGraham 是的,但在大多数情况下,__builtins____builtin__的别名。 - jamylak

10
如果人们只使用dict()而不是{},一般是因为他们不知道{}(这是相当了不起的)或者认为它更清晰(这是主观的,但不常见)。
然而,使用dict可以做一些{}无法实现的事情,例如将其传递给期望可调用对象的函数,如collections.defaultdict(dict)。此外,您还可以使用关键字参数来调用dict,这是一些人喜欢的方式:
>>> dict(spam=1, ham=2)
{'ham': 2, 'spam': 1}

个人而言,我更喜欢字典字面量语法,因为当您想要使用不是有效标识符的键时,它的效果更佳:

>>> dict(pass=1)
 File "<stdin>", line 1
    dict(pass=1)
        ^
SyntaxError: invalid syntax
>>> dict('ham and eggs'=1)
  File "<stdin>", line 1
SyntaxError: keyword can't be an expression

(因为一些键不是有效标识符而混合样式,呸。)

7

Doug Hellmann撰写了一篇详尽的性能比较报告。

简而言之

在使用CPython 2.7时,使用dict()创建字典的时间可能会比使用字面量语法慢6倍,并涉及更多的内存分配操作。如果您需要预先填充字典,请使用{}来创建字典,除非字面量语法无法胜任您的情况。


1

就像Thomas所说,我使用dict()函数来指定关键字。特别是当我手动构建一个大型字典用于数据初始化或其他用途时:能够使用关键字语法可以为每个元素节省两个按键(以及相关的视觉杂乱)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接