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

[] and {} vs list() and dict(), which is better?

我知道两者本质上是相同的,但就风格而言,用哪一个(更像Python)来创建空列表或听写更好?


就速度而言,这不是空名单/口述的竞争:

1
2
3
4
5
6
7
8
9
>>> from timeit import timeit
>>> timeit("[]")
0.040084982867934334
>>> timeit("list()")
0.17704233359267718
>>> timeit("{}")
0.033620194745424214
>>> timeit("dict()")
0.1821558326547077

对于非空:

1
2
3
4
5
6
7
8
9
10
11
12
>>> 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

另外,使用括号表示法让我们使用列表和字典的理解,这可能是足够的理由。


In my opinion [] and {} are the most pythonic and readable ways to create empty lists/dicts.

Be wary of set()'s though, for example:

1
2
this_set = {5}
some_other_set = {}

可能会令人困惑。第一个元素创建一个集合,第二个元素创建一个空的dict,而不是一个集合。


[]和更好

list()固有地慢于[],dict()固有地慢于,

因为

  • 有符号查找(如果您不只是将列表重新定义为其他内容,Python就无法提前知道!),

  • 有函数调用,

  • 然后它必须检查是否传递了iterable参数(这样它就可以用它的元素创建列表)。

  • 但在大多数情况下,速度差并不能产生实际的差异。

    (源)


    dict文字可能会更快一些,因为它的字节码更短:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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[]的情况。


    imho,使用list()dict()使您的Python看起来像c.ugh。


    对于[]和list()之间的差异,有一个陷阱我没有看到其他人指出。如果您使用字典作为列表的成员,这两种方法将给出完全不同的结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    In [1]: foo_dict = {"1":"foo","2":"bar
    <div class="
    suo-content">[collapse title=""]<ul><li>使用<wyn>list((foo_dict,))</wyn>可以得到与<wyn>[foo_dict]</wyn>相同的结果。<wyn>list()</wyn>方法接受一个iterable,因为它是唯一的参数,并对它进行迭代以向列表中添加元素。这将导致类似的陷阱,因为执行<wyn>list(some_list)</wyn>,这将使列表变平。</li></ul>[/collapse]</div><p><center>[wp_ad_camp_2]</center></p><hr>
    <p>
    there is one difference in behavior between [] and list() as example below shows. we need to use list() if we want to have the list of numbers returned, otherwise we get a map object! No sure how to explain it though.
    </p>

    [cc lang="
    python"]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


    时间似乎没有给出准确的时间。根据上面提到的dict()的timeit基准,它似乎需要大约200毫秒,这比正常的HTTP调用要慢得多。尝试在shell、dict()中运行,然后在timeit("dict()")中运行,您将看到执行过程中的明显差异;timeit("dict()")需要更长的时间。复制粘贴下面的代码并在shell中运行,在&;dict()中不会看到太大的差异。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        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


    大多数时候这主要是一个选择的问题。这是一个偏好问题。

    但是请注意,如果您有数字键,则不能这样做:

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

    你必须这样做:

    [cc lang="python"]mydict = {"1":"foo","2":"bar