舉一個例子,編寫一個函數計算一串數字里所有偶數的個數,其實是很簡單的問題,但是有些人是用生成器這么寫的:
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
生成器這么用其實是速度最慢的一種做法,花費了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
你看,這個 加速非常地明顯,僅花費了40.5微秒 。
而且還能進一步改進, 如果我們改變之前定義的f2,讓它在列表解析式后判斷數字是否為偶數,是偶數才會成為最終生成的列表中的一員,這樣有另一個加速:
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! 不僅如此,還能繼續加速!sum對于整數有一個快速路徑,但是這個快速路徑只激活類型為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微秒!怎么樣,小伙伴們學到了嗎
-
函數
+關注
關注
3文章
4327瀏覽量
62573 -
生成器
+關注
關注
7文章
315瀏覽量
21003 -
python
+關注
關注
56文章
4792瀏覽量
84630
發布評論請先 登錄
相關推薦
評論