举一个例子,编写一个函数计算一串数字里所有偶数的个数,其实是很简单的问题,但是有些人是用生成器这么写的:
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微秒!怎么样,小伙伴们学到了吗
全部0条评论
快来发表一下你的评论吧 !