python函數(shù)jump,python函數(shù)局部變量和全局變量同名

python 算法之青蛙跳出井口

一只青蛙在井底,每天白天向上爬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)

python 列表推導(dǎo) 為什么快

首先肯定 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遞歸如何達(dá)到某一條件停止并返回當(dāng)前值

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)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司