[] 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
Be wary of
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 |
同样适用于
imho,使用
对于[]和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