【问题标题】:Cache variable in list comprehension列表理解中的缓存变量
【发布时间】:2020-05-22 00:14:36
【问题描述】:

假设我有一个昂贵的操作expensive(x: int) -> int 和以下列表理解:

# expensive(x: int) -> int
# check(x: int) -> bool
[expensive(i) for i in range(LARGE_NUMBER) if check(expensive(i))]

如果我想避免为每个i 运行两次expensive(i),有没有办法通过列表理解来保存它的价值?

【问题讨论】:

  • 如果函数是纯函数,你可以用functools.lru_cache包裹它。
  • [e for e in map(expensive, range(LARGE_NUMBER)) if check(e)]
  • 当然可以使用循环。

标签: python performance list-comprehension dictionary-comprehension set-comprehension


【解决方案1】:

您可以模拟嵌套推导:

 [val for i in range(LARGE_NUMBER) for val in [expensive(i)] if check(val)]

【讨论】:

    【解决方案2】:

    使用海象:

    [cache for i in range(LARGE_NUMBER) if check(cache := expensive(i))]
    

    【讨论】:

    • 请注意,此功能仅适用于 Python 3.8
    猜你喜欢
    • 2021-11-29
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    相关资源
    最近更新 更多