Python生成器的使用方法

描述

举一个例子,编写一个函数计算一串数字里所有偶数的个数,其实是很简单的问题,但是有些人是用生成器这么写的:

  1. In[66]:def f1(x):

  2. ....:return sum(c in'02468'for c in str(x))

  3. ....:

  4. In[68]: x = int('1234567890'*50)

  5. In[69]:%timeit f1(x)

  6. 10000 loops, best of 5:52.2µs per loop

生成器这么用其实是速度最慢的一种做法,花费了52微秒。我们来看看如果我改成列表解析式会怎么样:

  1. In[67]:def f2(x):

  2. ....:return sum([c in'02468'for c in str(x)])

  3. In[68]: x = int('1234567890'*50)

  1. In[70]:%timeit f2(x)

  2. 10000 loops, best of 5:40.5µs per loop

你看,这个 加速非常地明显,仅花费了40.5微秒

而且还能进一步改进, 如果我们改变之前定义的f2,让它在列表解析式后判断数字是否为偶数,是偶数才会成为最终生成的列表中的一员,这样有另一个加速:

  1. In[71]:def f3(x):

  2. ....:return sum([Truefor c in str(x)if c in'02468'])

  3. ....:

  4. In[72]:%timeit f3(x)

  5. 10000 loops, best of 5:34.9µs per loop

34.9微秒,Perfect! 不仅如此,还能继续加速!sum对于整数有一个快速路径,但是这个快速路径只激活类型为int. bool不行,因此我们把True改成1,能更再加一次速!

  1. In[73]:def f4(x):

  2. ....:return sum([1for c in str(x)if c in'02468'])

  3. ....:

  4. In[74]:%timeit f4(x)

  5. 10000 loops, best of 5:33.3µs per loop

又快了,33.3微秒!怎么样,小伙伴们学到了吗

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分