$ 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
为什么要使用一个而不是另一个?
$ 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
为什么要使用一个而不是另一个?
我是喜欢单词胜过标点符号的人之一——例如,这就是我选择 Python 而不是 Perl 的原因之一。“没有大括号的生活会更好”(一个古老的 Python 格言,它出现在一件带有微笑少年卡通的 T 恤上;-)毕竟(当然,最初是指用于分组的大括号与缩进,但是,嘿,大括号是大括号!-)。
“支付”一些纳秒(为了使用清晰易读的短词而不是大括号、方括号和诸如此类的东西)通常是可以负担的(这主要是查找内置名称空间的成本,这是您每次支付的价格使用内置类型或函数,您可以通过在循环中提升一些查找来温和地优化它)。
所以,我通常是喜欢写dict()
for {}
、list(L)
代替L[:]
以及list()
for []
、tuple()
for()
等的人——只是对可发音代码的一般风格偏好。当我在使用不同风格的现有代码库上工作时,或者当我在一个新项目中的队友对另一种方式有强烈的偏好时,我当然可以接受这一点(当然,在队友的情况下,我不会不尝试一点福音,尽管;-)。
如果人们使用 (just) dict()
over (just) {}
,通常是因为他们不知道{}
(这很了不起),或者因为他们认为它更清楚(这是主观的,但不常见)。
但是,有些事情您可以做而dict
您不能做{}
,例如将其传递给需要可调用的东西,例如collections.defaultdict(dict)
. 还有一个事实是您可以dict
使用关键字参数调用,有些人更喜欢:
>>> dict(spam=1, ham=2)
{'ham': 2, 'spam': 1}
就个人而言,我更喜欢 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
(和混合样式只是因为某些键不是有效的标识符,哎呀。)
Doug Hellmann 对性能差异进行了详尽的比较。
tl;博士
在 CPython 2.7 中,使用 dict() 创建字典的时间比文字语法要长 6 倍,并且涉及更多的内存分配操作。使用 {} 创建字典,尤其是在您预填充它们时,除非文字语法不适用于您的情况。
就像 Thomas 说的,我使用 dict() 所以我可以指定关键字。特别是如果我为数据初始化或诸如此类的手动构建一个大型字典:能够使用关键字语法为每个元素节省了两次击键(以及相关的视觉混乱)。