舉一個(gè)例子,編寫一個(gè)函數(shù)計(jì)算一串?dāng)?shù)字里所有偶數(shù)的個(gè)數(shù),其實(shí)是很簡單的問題,但是有些人是用生成器這么寫的:
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微秒。我們來看看如果我改成列表解析式會怎么樣:
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ù)才會成為最終生成的列表中的一員,這樣有另一個(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對于整數(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文章
4372瀏覽量
64346 -
生成器
+關(guān)注
關(guān)注
7文章
322瀏覽量
21730 -
python
+關(guān)注
關(guān)注
56文章
4825瀏覽量
86324
發(fā)布評論請先 登錄

評論