"d = dict()"和"d = {}"之间的差异

tsh*_*ang 35 python performance dictionary timing

$ 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
Run Code Online (Sandbox Code Playgroud)

为什么用一个而不是另一个?

Ale*_*lli 54

我是那些喜欢标点符号的人之一 - 这是我在Perl上选择Python的原因之一."没有大括号的生活会变得更好"(一个古老的蟒蛇座右铭,穿着T恤上带着一个微笑少年的卡通片;-)毕竟(原本打算用括号和缩进来分组,当然,但是,嘿,嘿,牙箍是牙套! - ).

"支付"一些纳秒(为了使用清晰,可读的短字而不是括号,括号和诸如此类)通常是可以承受的(这主要是查找内置命名空间的成本,每次你付出的代价)使用内置类型或函数,你可以通过从循环中提取一些查找来温和地优化它.

所以,我通常是喜欢写作dict()的人{},list(L)代替L[:]以及list()for [],tuple()for ()等等 - 只是对可发音代码的一般风格偏好.当我在使用不同风格的现有代码库上工作时,或者当我在新项目中的队友具有强烈的偏好时,我当然可以接受这一点(尽管在队友的情况下尝试了一点传福音,尽管;-).

  • @Tshepang,例如,而不是`for x in x:f(dict())`(它为``dict`执行`len(x)`查找),首先在循环外绑定一个本地`d = dict`,然后`for x in x:f(d())`它为名称`d`执行更快的_local_查找.这是一种基本的Python技术,当它们被证明(通过分析,当然)成为性能瓶颈时,优化一些循环. (9认同)

Joh*_*ooy 25

d=dict()需要查找locals()然后,globals()然后__builtins__,d={}


Tho*_*ers 9

如果人们使用(只)dict()以上(只){},它通常是因为他们不知道{}(这是一个相当壮举),或者是因为他们认为这是更清晰(这是主观的,但不常见.)

但是,你可以做的事情dict是你无法做到的{},例如将它传递给期望可调用的东西,比如collections.defaultdict(dict).还有一个事实是你可以dict用关键字参数调用,有些人更喜欢:

>>> dict(spam=1, ham=2)
{'ham': 2, 'spam': 1}
Run Code Online (Sandbox Code Playgroud)

就个人而言,我更喜欢dict文字语法,因为当你想使用不是有效标识符的键时它更好用:

>>> 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
Run Code Online (Sandbox Code Playgroud)

(并且混合样式只是因为某些键不是有效的标识符,所以.)


Geo*_*lly 7

Doug Hellmann写了一篇关于性能差异的详尽比较.