BOOKPYTHON Telegram 3439
Как узнать размер генератора в Python?

В Python часто возникает задача определить размер генератора без необходимости извлечения всех его значений. Это полезно, если вы работаете с большими потоками данных и хотите избежать избыточного расхода памяти.

Пример с len()
Некоторые итераторы, такие как range, поддерживают вызов len():


len(range(10000)) # 10000


Однако генераторы не имеют длины, и попытка вызвать len() вызовет ошибку:


gen = (x ** 2 for x in range(10000))
len(gen) # TypeError: object of type 'generator' has no len()


Стандартное решение: преобразование в список
Один из способов получить размер генератора — это преобразовать его в список:


gen = (x ** 2 for x in range(10000))
print(len(list(gen))) # 10000


Этот подход работает, но имеет серьёзный недостаток: он требует загрузить все значения генератора в память. Если генератор очень большой, это может привести к нехватке памяти.

Более эффективный подход: подсчёт с помощью sum
Чтобы избежать лишнего расхода памяти, можно подсчитать количество элементов в генераторе с использованием sum():


gen = (x ** 2 for x in range(10000))
print(sum(1 for _ in gen)) # 10000


Этот метод обходит генератор "лениво", не создавая дополнительных списков, что делает его идеальным для работы с большими потоками данных.

Резюме
- Используйте len() только для итераторов, поддерживающих его (например, `range`).
- Для генераторов избегайте преобразования в список, если важна экономия памяти.
- Используйте sum(1 for _ in gen) для эффективного подсчёта элементов генератора.

👉 @BookPython
👍202



tgoop.com/BookPython/3439
Create:
Last Update:

Как узнать размер генератора в Python?

В Python часто возникает задача определить размер генератора без необходимости извлечения всех его значений. Это полезно, если вы работаете с большими потоками данных и хотите избежать избыточного расхода памяти.

Пример с len()
Некоторые итераторы, такие как range, поддерживают вызов len():


len(range(10000)) # 10000


Однако генераторы не имеют длины, и попытка вызвать len() вызовет ошибку:


gen = (x ** 2 for x in range(10000))
len(gen) # TypeError: object of type 'generator' has no len()


Стандартное решение: преобразование в список
Один из способов получить размер генератора — это преобразовать его в список:


gen = (x ** 2 for x in range(10000))
print(len(list(gen))) # 10000


Этот подход работает, но имеет серьёзный недостаток: он требует загрузить все значения генератора в память. Если генератор очень большой, это может привести к нехватке памяти.

Более эффективный подход: подсчёт с помощью sum
Чтобы избежать лишнего расхода памяти, можно подсчитать количество элементов в генераторе с использованием sum():


gen = (x ** 2 for x in range(10000))
print(sum(1 for _ in gen)) # 10000


Этот метод обходит генератор "лениво", не создавая дополнительных списков, что делает его идеальным для работы с большими потоками данных.

Резюме
- Используйте len() только для итераторов, поддерживающих его (например, `range`).
- Для генераторов избегайте преобразования в список, если важна экономия памяти.
- Используйте sum(1 for _ in gen) для эффективного подсчёта элементов генератора.

👉 @BookPython

BY Библиотека Python разработчика | Книги по питону


Share with your friend now:
tgoop.com/BookPython/3439

View MORE
Open in Telegram


Telegram News

Date: |

The Channel name and bio must be no more than 255 characters long “[The defendant] could not shift his criminal liability,” Hui said. Telegram Channels requirements & features There have been several contributions to the group with members posting voice notes of screaming, yelling, groaning, and wailing in different rhythms and pitches. Calling out the “degenerate” community or the crypto obsessives that engage in high-risk trading, Co-founder of NFT renting protocol Rentable World emiliano.eth shared this group on his Twitter. He wrote: “hey degen, are you stressed? Just let it out all out. Voice only tg channel for screaming”. According to media reports, the privacy watchdog was considering “blacklisting” some online platforms that have repeatedly posted doxxing information, with sources saying most messages were shared on Telegram.
from us


Telegram Библиотека Python разработчика | Книги по питону
FROM American