Переменная кэша в понимании списка - PullRequest
1 голос
/ 06 февраля 2020

Допустим, у меня дорогая операция expensive(x: int) -> int и следующее понимание списка:

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

Если я хочу избежать запуска expensive(i) дважды для каждого i, есть ли способ сохранить это значение с пониманием списка?

Ответы [ 2 ]

4 голосов
/ 06 февраля 2020

Использование моржа:

[cache for i in range(LARGE_NUMBER) if check(cache := expensive(i))]
0 голосов
/ 07 февраля 2020

Вы можете смоделировать вложенное понимание:

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