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

时间:2011-04-26 13:11:57

标签: python performance list dictionary

据我所知,它们本质上都是一样的,但就风格而言,用于创建空列表或字典的更好(更多Pythonic)?

12 个答案:

答案 0 :(得分:172)

就速度而言,没有竞争空名单/决定:

>>> from timeit import timeit
>>> timeit("[]")
0.040084982867934334
>>> timeit("list()")
0.17704233359267718
>>> timeit("{}")
0.033620194745424214
>>> timeit("dict()")
0.1821558326547077

和非空:

>>> 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

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

答案 1 :(得分:30)

在我看来,[]{}是创建空列表/词典的最pythonic和可读方式。

但要警惕set(),例如:

this_set = {5}
some_other_set = {}

可能令人困惑。第一个创建一个包含一个元素的集合,第二个创建一个空字典,一个集合。

答案 2 :(得分:26)

[]和{}更好

list()本身比[]慢,而dict()本身比{}慢,

<强>由于

  1. 有符号查找(如果你不只是将列表重新定义为其他东西,python就无法事先知道!),

  2. 有函数调用,

  3. 然后必须检查是否传递了可迭代的参数(因此它可以创建包含元素的列表)

  4. 在大多数情况下,速度差异不会产生任何实际差异。

    source

答案 3 :(得分:14)

dict文字可能比 tiny 更快,因为它的字节码更短:

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

同样适用于list vs []

答案 4 :(得分:3)

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

答案 5 :(得分:2)

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

list()总是在堆中创建新对象,但是[]可以出于多种原因重用存储单元。

答案 6 :(得分:1)

如果[]和list()之间存在差异,那么我还没有看到其他任何人指出的陷阱。 如果您使用字典作为列表的成员,则两者将给出完全不同的结果:

In [1]: foo_dict = {"1":"foo", "2":"bar"}

In [2]: [foo_dict]
Out [2]: [{'1': 'foo', '2': 'bar'}]

In [3]: list(foo_dict)
Out [3]: ['1', '2'] 

答案 7 :(得分:0)

[]和list()之间的行为有一个区别,如下例所示。如果我们想要返回数字列表,我们需要使用list(),否则我们得到一个地图对象!不知道如何解释它。

sth = [(1,2), (3,4),(5,6)]
sth2 = map(lambda x: x[1], sth) 
print(sth2) # print returns object <map object at 0x000001AB34C1D9B0>

sth2 = [map(lambda x: x[1], sth)]
print(sth2) # print returns object <map object at 0x000001AB34C1D9B0>
type(sth2) # list 
type(sth2[0]) # map

sth2 = list(map(lambda x: x[1], sth))
print(sth2) #[2, 4, 6]
type(sth2) # list
type(sth2[0]) # int

答案 8 :(得分:0)

list() 和 [] 之间没有这样的区别,但是如果你将它与迭代器一起使用,它会给我们:

nums = [1,2,3,4,5,6,7,8]

输入:print([iter(nums)])

输出:[]

输入:print(list(iter(nums)))

出:[1, 2, 3, 4, 5, 6, 7, 8]

答案 9 :(得分:-1)

方括号对表示列表对象之一或索引下标my_List [x]。

花括号对表示字典对象。

a_list = ['on','off',1,2]

a_dict = {开启:1,关闭:2}

答案 10 :(得分:-2)

timeit似乎没有给出准确的时间。根据上面针对dict()提到的timeit基准测试,它似乎需要~200ms,这比普通的http调用要慢。尝试在shell,dict()然后timeit(“dict()”)中运行,你会看到执行中的明显差异; timeit(“dict()”)需要更长时间。按照一段代码复制粘贴并在shell中运行,你不会在{}&amp;字典()。

    from datetime import datetime
    then = datetime.now()
    a = dict()
    now = datetime.now()
    print then
    print now

    then = datetime.now()
    b = {}
    now = datetime.now()
    print then
    print now

答案 11 :(得分:-5)

这主要是大部分时间的选择问题。这是一个偏好的问题。

但请注意,如果您有数字键,那么您无法做到:

mydict = dict(1="foo", 2="bar")

你必须这样做:

mydict = {"1":"foo", "2":"bar"}