【问题标题】:differences between "d = dict()" and "d = {}"“d = dict()”和“d = {}”之间的区别
【发布时间】:2011-02-14 06:12:29
【问题描述】:
$ 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 performance dictionary timing


    【解决方案1】:

    我是喜欢单词胜过标点符号的人之一——例如,这就是我选择 Python 而不是 Perl 的原因之一。 “没有大括号的生活会更好”(一个古老的 Python 格言,它出现在一件带有微笑少年卡通的 T 恤上;-)毕竟(当然,最初是指用于分组的大括号与缩进,但是,嘿, 大括号就是大括号!-)。

    “支付”几纳秒(为了使用清晰易读的短词而不是大括号、方括号和诸如此类的东西)通常是可以负担的(这主要是查找内置函数命名空间的成本,这是您付出的代价每次使用内置类型或函数时,您都可以通过在循环中提升一些查找来对其进行适度优化)。

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

    【讨论】:

    • “从循环中提升一些查找” - 这是什么意思?
    • @Tshepang,例如而不是for i in x: f(dict())(对len(x)进行名称dict的查找),首先在循环外绑定一个本地d=dict,然后for i in x: f(d())对名称@进行更快的local查找987654334@)。当某些循环被证明(当然是通过分析)是性能瓶颈时,这是一种基本的 Python 技术。
    • 顺便说一下(当然,与这个问题完全无关),Unladen Swallow 应该让这种成语 (d=dict) 变得不必要:)
    • @AlexMartelli s=str() vs. s='' 怎么样?
    • 我不会使用str() 代替'',而不是使用int() 代替0——这不会促进“可发音的代码”,也不会减少标点符号。
    【解决方案2】:

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

    【讨论】:

    • 不,dict__builtin__ 中。
    • @MikeGraham 是的,但在大多数情况下,__builtins____builtin__ 的别名
    【解决方案3】:

    如果人们使用(仅)dict() 而不是(仅){},这通常是因为他们不知道 {}(这很了不起),或者因为他们认为它更清晰(这是主观的) ,但不常见。)

    有些事情你可以用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
    

    (以及仅仅因为某些键不是有效的标识符而混合样式,哎呀。)

    【讨论】:

      【解决方案4】:

      Doug Hellmann 详细描述了性能差异的 comparison

      tl;dr

      在 CPython 2.7 中,使用 dict() 创建字典最多需要 6 个 时间长,涉及的内存分配操作比 字面语法。使用 {} 创建字典,特别是如果您是 预先填充它们,除非文字语法不适用于您的 案例。

      【讨论】:

        【解决方案5】:

        就像 Thomas 说的,我使用 dict() 来指定关键字。特别是如果我为数据初始化或诸如此类手动构建一个大型字典:能够使用关键字语法为每个元素节省了两次击键(以及相关的视觉混乱)。

        【讨论】:

          猜你喜欢
          • 2016-11-01
          • 2022-10-14
          • 1970-01-01
          • 1970-01-01
          • 2014-12-11
          • 2021-10-18
          • 1970-01-01
          • 2017-04-07
          • 1970-01-01
          相关资源
          最近更新 更多