一只青蛙在井底,每天白天向上爬3米,夜晚又滑下去2米,
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、虛擬空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、五蓮網(wǎng)站維護(hù)、網(wǎng)站推廣。
井深10米青蛙要爬多少天才能爬到井口?
i表示天數(shù)
a青蛙高度
流程圖
a=0
for i in range(1,20):
a+=3
if a=10:
break
a-=2
a=0
i=0
while True:
i+=1
a+=3
if a=10:
break
a-=2
def jump(a, i):
a+=3
if a=10:
print(i)
return
a-=2
i+=1
jump(a,i)
a=0
i=1
jump(a, i)
首先肯定 map 和列表推導(dǎo)效率確實(shí)會(huì)比循環(huán)的高,
先說(shuō)列表推導(dǎo),下邊是我在 ipython 里的測(cè)試結(jié)果(測(cè)試環(huán)境 Python 2.7.10):
long_list = range(1000)
a = []
%timeit for i in long_list: a.append(i+1)
10000 loops, best of 3: 100 μs per loop
%timeit [i+1 for i in long_list]
10000 loops, best of 3: 43.3 μs per loop
可以看出列表推導(dǎo)還是要快過(guò) for 循環(huán)的。
那為什么列表推導(dǎo)會(huì)快呢?我們直接調(diào)用 python 的 dis 模塊去看看他的字節(jié)碼:
這個(gè)是列表推導(dǎo)那一行代碼的字節(jié)碼:
0 BUILD_LIST 0
3 LOAD_GLOBAL 0 (long_list)
6 GET_ITER
7 FOR_ITER 16 (to 26)
10 STORE_FAST 0 (i)
13 LOAD_FAST 0 (i)
16 LOAD_CONST 1 (1)
19 BINARY_ADD
20 LIST_APPEND 2
23 JUMP_ABSOLUTE 7
...
這個(gè)是 for 循環(huán)那一行的字節(jié)碼:
6 SETUP_LOOP 31 (to 40)
9 LOAD_GLOBAL 0 (long_list)
12 GET_ITER
13 FOR_ITER 23 (to 39)
16 STORE_FAST 1 (i)
19 LOAD_FAST 0 (a)
22 LOAD_ATTR 1 (append)
25 LOAD_FAST 1 (i)
28 LOAD_CONST 1 (1)
31 BINARY_ADD
32 CALL_FUNCTION 1
35 POP_TOP
36 JUMP_ABSOLUTE 13
...
對(duì)比一下不難發(fā)現(xiàn)其實(shí)列表推導(dǎo)和 for 循環(huán)的過(guò)程幾乎是一樣的,除了如何append。所以你要說(shuō)他是語(yǔ)法糖也不是不行……
在
列表推導(dǎo)中直接使用了‘LIST_APPEND’這個(gè)字節(jié)碼來(lái)實(shí)現(xiàn) append 功能,效率相當(dāng)?shù)母?。而?for 循環(huán)中每次循環(huán)都要先載入
append 這個(gè)屬性然后再 ‘CALL_FUNCTION’一下。這樣勢(shì)必就會(huì)慢了很多。為了驗(yàn)證我們的猜想,我們把 append
這個(gè)函數(shù)存到局部變量里去:
a = []
invoke = a.append
%timeit for i in long_list: invoke(i+1)
10000 loops, best of 3: 67.2 μs per loop
發(fā)現(xiàn)沒(méi)有比前一個(gè)版本的 for 循環(huán)快了接近40%,剩下的多出來(lái)20多 μs 的開(kāi)銷自然就是‘CALL_FUNCTION’的開(kāi)銷咯 ╮(╯_╰)╭。
相信到這里你應(yīng)該明白了為什么列表推導(dǎo)要比 for 循環(huán)快吧,秘訣就在這個(gè)‘LIST_APPEND’這個(gè)字節(jié)碼上,相當(dāng)于你直接調(diào)用了 C 語(yǔ)言版本的函數(shù)(不嚴(yán)謹(jǐn))而且越過(guò)了一些中間步驟。
接下來(lái)簡(jiǎn)單說(shuō)說(shuō) map 的事情,直接使用 map 一般來(lái)說(shuō)是要比循環(huán)快的,但有的時(shí)候情況會(huì)比較詭異,例如:
%timeit for i in long_list: a.append(i+1)
10000 loops, best of 3: 100 μs per loop
%timeit map(lambda x: x+1, long_list)
10000 loops, best of 3: 109 μs per loop
別急,我們把 map 的寫(xiě)法改成這樣:
int_object = 1
%timeit map(int_object.__add__, long_list)
10000 loops, best of 3: 41.6 μs per loop
于是神奇的事情出現(xiàn)了!基本上和列表推導(dǎo)一樣快!(⊙o⊙)
這個(gè)主要是因?yàn)?lambda
表達(dá)式生成的函數(shù)是 Python 的,而直接用+運(yùn)算符或者_(dá)_add__方法調(diào)用的是 C 版本的。你要是把列表推導(dǎo)里邊的+換成 lambda
表達(dá)式兩者的速度差不多,map 一般來(lái)說(shuō)還要快上一點(diǎn)點(diǎn)。本質(zhì)上來(lái)說(shuō) map 調(diào)用了底層的 C 函數(shù)所以速度自然是快的。粗暴的總結(jié)一下就是不用
lambda 的時(shí)候 map 要快一些
Python break語(yǔ)句,就像在C語(yǔ)言中,打破了最小封閉for或while循環(huán)。
break語(yǔ)句用來(lái)終止循環(huán)語(yǔ)句,即循環(huán)條件沒(méi)有False條件或者序列還沒(méi)被完全遞歸完,也會(huì)停止執(zhí)行循環(huán)語(yǔ)句。
break語(yǔ)句用在while和for循環(huán)中。
如果您使用嵌套循環(huán),break語(yǔ)句將停止執(zhí)行最深層的循環(huán),并開(kāi)始執(zhí)行下一行代碼。
名稱欄目:python函數(shù)jump,python函數(shù)局部變量和全局變量同名
文章源于:http://muchs.cn/article36/hcgspg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開(kāi)發(fā)、、網(wǎng)站收錄、品牌網(wǎng)站建設(shè)、面包屑導(dǎo)航、網(wǎng)站營(yíng)銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)