最近知乎上有人对Python生成器的使用有误解。在这里我们将讨论这样使用它们是否正确。举个例子,写一个函数计算一串数字中所有偶数的个数,其实是一个很简单的问题,但是有人用生成器写成这样:In[66]:deff1(x):....:returnsum(cin'02468'forcinstr(x))....:In[68]:x=int('1234567890'*50)In[69]:%timeitf1(x)10000次循环,5次中最好:每次循环52.2微秒生成器实际上是执行此操作的最慢方法,需要52微秒。让我们看看如果我将它更改为列表理解会发生什么:In[67]:deff2(x):....:returnsum([cin'02468'forcinstr(x)])。...:In[70]:%timeitf2(x)10000loops,bestof5:40.5μsperloop你看,这个加速非常明显,只用了40.5μs。并且可以进一步改进。如果我们改变之前定义的f2,让它在listcomprehension之后判断这个数是否为偶数,如果是偶数就会成为最终生成的list的成员,所以还有一个提速:In[71]:deff3(x):....:returnsum([Trueforcinstr(x)ifcin'02468'])....:In[72]:%timeitf3(x)10000loops,bestof5:每个循环34.9微秒34.9微秒,完美!不仅如此,它还能继续加速!sum有一个整数的快速路径,但是这个快速路径只激活int类型的变量。bool不行,所以我们把True改成1,这样可以再增加一个速度!在[73]中:deff4(x):....:returnsum([1forcinstr(x)ifcin'02468'])....:In[74]:%timeitf4(x)10000次循环,5次中最佳:每次循环33.3μsPython实用书(pythondict.com)不仅仅是一本书欢迎来到公众号:Python实用书
