3 回答

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超10個(gè)贊
因?yàn)閇]和{}是文字語法。Python可以創(chuàng)建字節(jié)碼僅用于創(chuàng)建列表或字典對(duì)象:
>>> import dis
>>> dis.dis(compile('[]', '', 'eval'))
1 0 BUILD_LIST 0
3 RETURN_VALUE
>>> dis.dis(compile('{}', '', 'eval'))
1 0 BUILD_MAP 0
3 RETURN_VALUE
list()和dict()是單獨(dú)的對(duì)象。它們的名稱需要解析,必須包含堆棧以推入?yún)?shù),必須存儲(chǔ)框架以供以后檢索,并且必須進(jìn)行調(diào)用。這都需要更多時(shí)間。
對(duì)于空的情況,這意味著您至少要有一個(gè)LOAD_NAME(必須在全局名稱空間以及__builtin__模塊中進(jìn)行搜索),后跟一個(gè)CALL_FUNCTION必須保留當(dāng)前幀:
>>> dis.dis(compile('list()', '', 'eval'))
1 0 LOAD_NAME 0 (list)
3 CALL_FUNCTION 0
6 RETURN_VALUE
>>> dis.dis(compile('dict()', '', 'eval'))
1 0 LOAD_NAME 0 (dict)
3 CALL_FUNCTION 0
6 RETURN_VALUE
您可以使用以下命令分別計(jì)時(shí)名稱查找timeit:
>>> import timeit
>>> timeit.timeit('list', number=10**7)
0.30749011039733887
>>> timeit.timeit('dict', number=10**7)
0.4215109348297119
時(shí)間差異可能是字典哈希沖突。從調(diào)用這些對(duì)象的時(shí)間中減去這些時(shí)間,然后將結(jié)果與使用文字的時(shí)間進(jìn)行比較:
>>> timeit.timeit('[]', number=10**7)
0.30478692054748535
>>> timeit.timeit('{}', number=10**7)
0.31482696533203125
>>> timeit.timeit('list()', number=10**7)
0.9991960525512695
>>> timeit.timeit('dict()', number=10**7)
1.0200958251953125
因此,1.00 - 0.31 - 0.30 == 0.39每1000萬次調(diào)用必須調(diào)用該對(duì)象花費(fèi)了額外的幾秒鐘。
您可以通過將全局名稱別名為本地名稱來避免全局查找成本(使用timeit設(shè)置,綁定到名稱的所有內(nèi)容都是本地名稱):
>>> timeit.timeit('_list', '_list = list', number=10**7)
0.1866450309753418
>>> timeit.timeit('_dict', '_dict = dict', number=10**7)
0.19016098976135254
>>> timeit.timeit('_list()', '_list = list', number=10**7)
0.841480016708374
>>> timeit.timeit('_dict()', '_dict = dict', number=10**7)
0.7233691215515137
但您永遠(yuǎn)無法克服這些CALL_FUNCTION成本。

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超11個(gè)贊
list()需要全局查找和函數(shù)調(diào)用,但需要[]編譯為一條指令。看到:
Python 2.7.3
>>> import dis
>>> print dis.dis(lambda: list())
1 0 LOAD_GLOBAL 0 (list)
3 CALL_FUNCTION 0
6 RETURN_VALUE
None
>>> print dis.dis(lambda: [])
1 0 BUILD_LIST 0
3 RETURN_VALUE
None

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超8個(gè)贊
因?yàn)閘ist是一個(gè)功能轉(zhuǎn)化說一個(gè)字符串列表對(duì)象,而[]用于創(chuàng)建一個(gè)列表蝙蝠。嘗試一下(可能對(duì)您更有意義):
x = "wham bam"
a = list(x)
>>> a
["w", "h", "a", "m", ...]
而
y = ["wham bam"]
>>> y
["wham bam"]
為您提供包含您所輸入內(nèi)容的實(shí)際列表。
添加回答
舉報(bào)