第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為什么[]比list()快?

為什么[]比list()快?

FFIVE 2019-09-27 16:33:56
我最近比較了[]和的處理速度,并list()驚訝地發(fā)現(xiàn)它的[]運(yùn)行速度是的三倍以上list()。我跑了相同的測(cè)試與{}和dict(),結(jié)果幾乎相同:[]和{}兩個(gè)花了大約0.128sec /百萬次,而list()和dict()大約花費(fèi)每個(gè)0.428sec /萬次。為什么是這樣?不要[]和{}(可能()和'',太)立即傳回文字的一些空股票的份,而其明確命名同行(list(),dict(),tuple(),str())完全去創(chuàng)建一個(gè)對(duì)象,他們是否真的有元素?我不知道這兩種方法有何不同,但我很想找出答案。我在文檔中或SO上都找不到答案,而尋找空括號(hào)卻比我預(yù)期的要麻煩得多。通過分別調(diào)用timeit.timeit("[]")和timeit.timeit("list()"),和timeit.timeit("{}")和timeit.timeit("dict()")來比較列表和字典,以獲得計(jì)時(shí)結(jié)果。我正在運(yùn)行Python 2.7.9。我最近發(fā)現(xiàn)“ 為什么True慢于if? ”比較了if Trueto 的性能,if 1并且似乎觸及了類似的文字對(duì)全局場(chǎng)景;也許也值得考慮。
查看完整描述

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成本。


查看完整回答
反對(duì) 回復(fù) 2019-09-27
?
慕尼黑8549860

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


查看完整回答
反對(duì) 回復(fù) 2019-09-27
?
守著星空守著你

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í)際列表。


查看完整回答
反對(duì) 回復(fù) 2019-09-27
  • 3 回答
  • 0 關(guān)注
  • 823 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)