Оценка понимания списка Python

У меня есть понимание списка, которое, я надеюсь, более производительно, чем для эквивалентного цикла. Однако я не уверен, как python оценивает понимание. Если он сначала оценивает ширину, то операция является очень дорогой, однако представляется целесообразным оценивать их все на каждом этапе, требуя только того, чтобы данные были оценены один раз и переданы через циклы. Понимание списка, о котором я задаюсь вопросом, ниже.

[(Counter(x.keys()), x) for x in [Counter([hashxx(w)%100000 for w in n.split()]) for n in x]]

Как это будет оцениваться? будет ли вычисляться хеш, а затем подниматься к внешнему циклу или сначала будут вычислены все хеш?

1 ответ

Решение

Понимание списка всегда полностью оценивается там, где оно происходит, как и любое другое выражение, подобное a+b, Понимание списка не "знает", что оно находится внутри другого понимания списка, поэтому оно не может вести себя по-другому на этой основе.

Если вы хотите выполнять итерацию "по крупицам", генерируя одновременно только один элемент из списка, то используйте выражение генератора.

Вот простое сравнение:

def inner(x):
    print("inner")
    return x.upper()

def outer(x):
    print("outer")
    return x+"!"

# inner comprehension is a list comprehension
>>> [outer(x) for x in [inner(x) for x in ('a', 'b', 'c')]]
inner
inner
inner
outer
outer
outer
['A!', 'B!', 'C!']

# inner comprehension is a generator comprehension
>>> [outer(x) for x in (inner(x) for x in ('a', 'b', 'c'))]
inner
outer
inner
outer
inner
outer
['A!', 'B!', 'C!']
Другие вопросы по тегам