【问题标题】:Which is more pythonic/efficient, any on a listcomp or genexp? [duplicate]在 listcomp 或 genexp 上哪个更 Pythonic/高效? [复制]
【发布时间】:2018-07-03 18:23:16
【问题描述】:

我正在尝试判断哪个更 Pythonic。

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 更快吗?

【问题讨论】:

  • 在这种情况下使用if True 或立即使用return 会更有效。
  • 对不起,我选择了一个简单的例子来具体演示;我的用例不是取自这样的表达式。
  • 注意,遵循 PEP8 将是 Pythonic,这意味着,no spaces immediately inside parentheses, brackets, or braces。此外,生成器表达式,如果它们是唯一的参数,则不需要括号!这好多了,不是吗? any((i % 2 == 0 and i > 4) for i in range(10))

标签: python


【解决方案1】:

使用基因表达式。

列表 comp 将在运行 any 之前进行全面评估,而 genexp 不会。 any 将在第一个 True 值上短路,因此您可以通过这种方式保存自己的评估。

【讨论】:

  • 这就是我的想法,但我不确定any 是否最终会编造一份清单。我开始更加欣赏这些 genexp,并且正在慢慢开始推动我正在研究的代码库,以便在适当的时候使用它们来代替列表组合和 for 循环。
  • @jxramos 一般 genexp 会更快。最常见的反例是str.join(因为它最终还是要构造一个列表)
  • @AdamSmith 以我的经验,通常列表组合会更快,除非存在短路行为,或者最终列表会很大,例如 >1,000,000。对于sum(i for i in range(n))sum([i for i in range(n)]),尝试使用不同大小的 n。 genexp 的真正优势在于内存效率。在我的机器上,genexp 版本直到 n == 5000000 左右才更快
猜你喜欢
  • 1970-01-01
  • 2017-11-30
  • 2016-10-18
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多