python 元组比较大小_为什么元组比列表更快?
所報(bào)道的“build設(shè)速度”比率只適用于常量元組(項(xiàng)目用文字表示)。 仔細(xì)觀察(并在機(jī)器上重復(fù) – 只需在shell /命令窗口input命令!)…:
$ python3.1 -mtimeit -s'x,y,z=1,2,3' '[x,y,z]' 1000000 loops, best of 3: 0.379 usec per loop $ python3.1 -mtimeit '[1,2,3]' 1000000 loops, best of 3: 0.413 usec per loop $ python3.1 -mtimeit -s'x,y,z=1,2,3' '(x,y,z)' 10000000 loops, best of 3: 0.174 usec per loop $ python3.1 -mtimeit '(1,2,3)' 10000000 loops, best of 3: 0.0602 usec per loop $ python2.6 -mtimeit -s'x,y,z=1,2,3' '[x,y,z]' 1000000 loops, best of 3: 0.352 usec per loop $ python2.6 -mtimeit '[1,2,3]' 1000000 loops, best of 3: 0.358 usec per loop $ python2.6 -mtimeit -s'x,y,z=1,2,3' '(x,y,z)' 10000000 loops, best of 3: 0.157 usec per loop $ python2.6 -mtimeit '(1,2,3)' 10000000 loops, best of 3: 0.0527 usec per loop
我沒(méi)有在3.0上進(jìn)行測(cè)量,因?yàn)楫?dāng)然我沒(méi)有它 – 它已經(jīng)完全過(guò)時(shí)了,完全沒(méi)有理由保留它,因?yàn)?.1在各方面都優(yōu)于它(Python 2.7,如果你可以升級(jí)到2.6,在每個(gè)任務(wù)中的速度比2.6快了近20%,正如你所看到的,速度比3.1快 – 所以,如果你關(guān)心性能的話(huà),Python 2.7真的是唯一的版本要去!)。
無(wú)論如何,關(guān)鍵在于,在每個(gè)Python發(fā)行版中,從常量字面值構(gòu)build列表的速度大致相同,或者稍微低于通過(guò)variables引用的值構(gòu)build列表; 但是元組的performance卻非常不同 – 從常量字面值構(gòu)build元組的速度通常比構(gòu)buildvariables引用的值快3倍! 你可能想知道這是怎么回事吧?)
答案:由常量字面值構(gòu)成的元組可以很容易地被Python編譯器識(shí)別為一個(gè)不變的常量字面本身:所以它本質(zhì)上是一次構(gòu)build的,當(dāng)編譯器將源代碼變成字節(jié)碼時(shí),隱藏在“常量表” “的相關(guān)function或模塊。 當(dāng)這些字節(jié)碼執(zhí)行時(shí),他們只需要恢復(fù)預(yù)build的常量元組 – 嘿presto! – )
這個(gè)簡(jiǎn)單的優(yōu)化不能應(yīng)用到列表中,因?yàn)榱斜硎且粋€(gè)可變對(duì)象,所以至關(guān)重要的是,如果相同的expression式如[1, 2, 3]執(zhí)行兩次(在一個(gè)循環(huán)中 – timeit模塊使循環(huán)開(kāi)啟你的代表;-),每次都重新構(gòu)造一個(gè)新的列表對(duì)象,而且構(gòu)造(如編譯器無(wú)法簡(jiǎn)單地將其識(shí)別為編譯時(shí)常量和不可變對(duì)象時(shí)構(gòu)造的元組)需要一點(diǎn)時(shí)間。
也就是說(shuō),元組構(gòu)造(當(dāng)兩個(gè)構(gòu)造實(shí)際上必須發(fā)生時(shí))仍然是列表構(gòu)造的兩倍 – 這種差異可以用元組的簡(jiǎn)單性來(lái)解釋,其他答案已經(jīng)多次提到。 但是,這種簡(jiǎn)單性并沒(méi)有考慮到六倍或六倍以上的加速,正如你所觀察到的,如果你只是將列表和元組的構(gòu)造與簡(jiǎn)單的常量文字作為它們的項(xiàng)目進(jìn)行比較,
總結(jié)
以上是生活随笔為你收集整理的python 元组比较大小_为什么元组比列表更快?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: logisim优先编码器怎么用_编码器简
- 下一篇: 业务单号自动增长的处理办法