在listcomp或genexp上,哪一个更具pythonic/效率?
我想知道哪个更像蟒蛇在listcomp或genexp上,哪一个更具pythonic/效率?,python,Python,我想知道哪个更像蟒蛇 if any( ( ( i % 2 == 0 and i > 4 ) for i in range(10) ) ) : return if any( [ ( i % 2 == 0 and i > 4 ) for i in range(10) ] ) : return 生成器表达式形成短路的速度是否比列表comp快?使用genexp 在运行any之前,列表comp将进行完全评估,而genexp不会任何都会在第一个True值上短路,因此您可以通过这种
if any( ( ( i % 2 == 0 and i > 4 ) for i in range(10) ) ) :
return
if any( [ ( i % 2 == 0 and i > 4 ) for i in range(10) ] ) :
return
生成器表达式形成短路的速度是否比列表comp快?使用genexp
在运行
any
之前,列表comp将进行完全评估,而genexp不会任何
都会在第一个True
值上短路,因此您可以通过这种方式保存自己的评估。在这种情况下,如果使用if True
或立即返回
将更有效。对不起,我选择了一个简单的示例,只是为了具体演示;我的用例并不是取自这样一个表达式。请注意,遵循PEP8是一个Pythonic,它的意思是。此外,生成器表达式(如果它们是唯一的参数)不需要括号!这好多了,不是吗any((i%2==0,i>4)表示范围(10)内的i)
这就是我的想法,但我不确定any
是否最终会编造一个列表。我开始越来越欣赏这些genexp,并慢慢开始推动我所使用的代码库,在适当的时候使用它们来代替列表comp和for循环。@jxramos通常genexp会更快。最常见的反例是str.join
(因为它最终还是构建了一个列表)@AdamSmith根据我的经验,通常列表比较快,除非有短路行为,或者最终的列表比较大,比如>1000000。尝试使用不同大小的n表示sum(i表示范围内的i(n))
vssum([i表示范围内的i(n)])
。genexp的真正优势是内存效率。在我的机器上,genexp版本在大约n==5000000之前并没有更快