首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用dict字面量和dict构造函数有区别吗?

使用dict字面量和dict构造函数有区别吗?
EN

Stack Overflow用户
提问于 2011-07-07 20:29:42
回答 11查看 149.3K关注 0票数 222

在使用PyCharm时,我注意到它提供了转换字典文字的功能

代码语言:javascript
复制
d = {
    'one': '1',
    'two': '2',
}

到一个字典构造函数

代码语言:javascript
复制
d = dict(one='1', two='2')

这些不同的方法在一些重要方面有区别吗?

(在写这个问题时,我注意到使用dict()似乎不可能指定一个数字键。d = {1: 'one', 2: 'two'}是可能的,但显然,dict(1='one' ...)不是。还有别的吗?)

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2011-07-07 20:43:38

我认为你已经指出了最明显的区别。除此之外,

第一个不需要查找dict,这应该会使它稍微快一点

第二个方法在locals()中查找dict,然后在globals()中查找,然后查找内置代码,因此您可以通过定义一个名为dict的本地代码来切换行为,尽管我想不出在任何地方这可能是一个好主意,除非是在调试时

票数 129
EN

Stack Overflow用户

发布于 2011-07-07 22:15:00

文本要快得多,因为它使用优化的BUILD_MAP和STORE_MAP操作码,而不是通用的CALL_FUNCTION:

代码语言:javascript
复制
> python2.7 -m timeit "d = dict(a=1, b=2, c=3, d=4, e=5)"
1000000 loops, best of 3: 0.958 usec per loop

> python2.7 -m timeit "d = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}"
1000000 loops, best of 3: 0.479 usec per loop

> python3.2 -m timeit "d = dict(a=1, b=2, c=3, d=4, e=5)"
1000000 loops, best of 3: 0.975 usec per loop

> python3.2 -m timeit "d = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}"
1000000 loops, best of 3: 0.409 usec per loop
票数 66
EN

Stack Overflow用户

发布于 2011-07-07 20:58:14

它们在Python 3.2上看起来几乎一样。

正如gnibbler指出的那样,第一个不需要查找dict,这应该会让它更快一点。

代码语言:javascript
复制
>>> def literal():
...   d = {'one': 1, 'two': 2}
...
>>> def constructor():
...   d = dict(one='1', two='2')
...
>>> import dis
>>> dis.dis(literal)
  2           0 BUILD_MAP                2
              3 LOAD_CONST               1 (1)
              6 LOAD_CONST               2 ('one')
              9 STORE_MAP
             10 LOAD_CONST               3 (2)
             13 LOAD_CONST               4 ('two')
             16 STORE_MAP
             17 STORE_FAST               0 (d)
             20 LOAD_CONST               0 (None)
             23 RETURN_VALUE
>>> dis.dis(constructor)
  2           0 LOAD_GLOBAL              0 (dict)
              3 LOAD_CONST               1 ('one')
              6 LOAD_CONST               2 ('1')
              9 LOAD_CONST               3 ('two')
             12 LOAD_CONST               4 ('2')
             15 CALL_FUNCTION          512
             18 STORE_FAST               0 (d)
             21 LOAD_CONST               0 (None)
             24 RETURN_VALUE
票数 41
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6610606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档