在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))
vs
sum([i表示范围内的i(n)])
。genexp的真正优势是内存效率。在我的机器上,genexp版本在大约n==5000000之前并没有更快