舉一個(gè)例子,編寫一個(gè)函數(shù)計(jì)算一串?dāng)?shù)字里所有偶數(shù)的個(gè)數(shù),其實(shí)是很簡(jiǎn)單的問題,但是有些人是用生成器這么寫的:
In[66]:def f1(x):
....:return sum(c in'02468'for c in str(x))
....:
In[68]: x = int('1234567890'*50)
In[69]:%timeit f1(x)
10000 loops, best of 5:52.2μs per loop
生成器這么用其實(shí)是速度最慢的一種做法,花費(fèi)了52微秒。我們來看看如果我改成列表解析式會(huì)怎么樣:
In[67]:def f2(x):
....:return sum([c in'02468'for c in str(x)])
In[68]: x = int('1234567890'*50)
In[70]:%timeit f2(x)
10000 loops, best of 5:40.5μs per loop
你看,這個(gè) 加速非常地明顯,僅花費(fèi)了40.5微秒 。
而且還能進(jìn)一步改進(jìn), 如果我們改變之前定義的f2,讓它在列表解析式后判斷數(shù)字是否為偶數(shù),是偶數(shù)才會(huì)成為最終生成的列表中的一員,這樣有另一個(gè)加速:
In[71]:def f3(x):
....:return sum([Truefor c in str(x)if c in'02468'])
....:
In[72]:%timeit f3(x)
10000 loops, best of 5:34.9μs per loop
34.9微秒,Perfect! 不僅如此,還能繼續(xù)加速!sum對(duì)于整數(shù)有一個(gè)快速路徑,但是這個(gè)快速路徑只激活類型為int. bool不行,因此我們把True改成1,能更再加一次速!
In[73]:def f4(x):
....:return sum([1for c in str(x)if c in'02468'])
....:
In[74]:%timeit f4(x)
10000 loops, best of 5:33.3μs per loop
又快了,33.3微秒!怎么樣,小伙伴們學(xué)到了嗎
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4365瀏覽量
63872 -
生成器
+關(guān)注
關(guān)注
7文章
322瀏覽量
21569 -
python
+關(guān)注
關(guān)注
56文章
4822瀏覽量
85875
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
python生成器
STM32庫函數(shù)代碼自動(dòng)生成器正式版
python生成器是什么
Python中的生成器是什么?它們的效率和可用性如何?
TSMaster報(bào)文發(fā)送的信號(hào)生成器操作說明

評(píng)論