[]和{} vs list()和dict(),哪个更好?

Noa*_*ith 97 python performance dictionary list

我明白它们本质上都是一样的,但在风格方面,哪个更好(更多Pythonic)用于创建空列表或字典?

Gre*_*ins 182

就速度而言,空列表/决策没有竞争:

>>> from timeit import timeit
>>> timeit("[]")
0.040084982867934334
>>> timeit("list()")
0.17704233359267718
>>> timeit("{}")
0.033620194745424214
>>> timeit("dict()")
0.1821558326547077
Run Code Online (Sandbox Code Playgroud)

对于非空的:

>>> timeit("[1,2,3]")
0.24316302770330367
>>> timeit("list((1,2,3))")
0.44744206316727286
>>> timeit("list(foo)", setup="foo=(1,2,3)")
0.446036018543964
>>> timeit("{'a':1, 'b':2, 'c':3}")
0.20868602015059423
>>> timeit("dict(a=1, b=2, c=3)")
0.47635635255323905
>>> timeit("dict(bar)", setup="bar=[('a', 1), ('b', 2), ('c', 3)]")
0.9028228448029267
Run Code Online (Sandbox Code Playgroud)

另外,使用括号表示法让你使用列表和字典理解,这可能是合理的.

  • 也可以使用英文名称来完成字典和列表推导.示例:`list(i for i in range(10)if i%2)` (3认同)
  • 是不是有{}和[]这么快的原因?我以为他们只是别名. (3认同)
  • @piyush实际上,`timeit()`函数报告执行指定次数的迭代的总时间,默认情况下为'1000000'。因此,上面的示例是运行一百万次代码段的秒数。例如`timeit('dict()',number = 1)//-> 4.0531158447265625e-06`(一次迭代)而`timeit('dict()')//-> 0.12412905693054199`(一百万次迭代) (2认同)

orl*_*rlp 32

在我看来[],{}是创建空列表/ dicts的最pythonic和可读的方法.

但要警惕set(),例如:

this_set = {5}
some_other_set = {}
Run Code Online (Sandbox Code Playgroud)

可能会让人困惑.第一个创建一个包含一个元素的集合,第二个创建一个空的dict而不是一个集合.

  • `{}`总是创建一个空字典.`{1,2,3}`在2.7+中创建一个集合,但在`2.6`和旧版本中是语法错误. (4认同)
  • @EnderLook:实际上,通过[generalized unpacking](https://www.python.org/dev/peps/pep-0448/),您可以使用`{*()}`用文字制作一个空的`set`句法.我把它称为独眼猴操作员.:-) (4认同)
  • 对不起?这是一个名为`some_epic_set` 的变量,它指向一个空的`dict` 对象......它不是一个空集。对于空集,您需要使用`set()`。 (2认同)
  • @ 6502:的确,但是`{5}`创建一个带有一个元素的集合是一个常见的陷阱,`5`和`{}`是一个空字典. (2认同)

Thi*_*ter 16

该字典的文字可能是一个小小的其字节码更短更快一点:

In [1]: import dis
In [2]: a = lambda: {}
In [3]: b = lambda: dict()

In [4]: dis.dis(a)
  1           0 BUILD_MAP                0
              3 RETURN_VALUE

In [5]: dis.dis(b)
  1           0 LOAD_GLOBAL              0 (dict)
              3 CALL_FUNCTION            0
              6 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)

同样适用于listvs[]

  • 这假定BUILD_MAP和LOAD_GLOBAL是恒定时间并且花费相同的时间.不大可能.timeit给出了更好的估计. (7认同)

小智 7

小心list()并以[]不同的方式工作:

>>> def a(p):
...     print(id(p))
... 
>>> for r in range(3):
...     a([])
... 
139969725291904
139969725291904
139969725291904
>>> for r in range(3):
...     a(list())
... 
139969725367296
139969725367552
139969725367616
Run Code Online (Sandbox Code Playgroud)

list()总是在堆上创建一个新对象,但[]在许多情况下可以重用内存单元。


Ric*_*dle 5

恕我直言,使用list()dict()让你的Python看起来像C.唉。