[Tutor] increment a counter inside generator

Steven D'Aprano steve at pearwood.info
Thu Mar 14 02:59:04 CET 2013


On 14/03/13 12:13, David Knupp wrote:

> FWIW, if you're working with very large lists, but don't need to create the full list in memory, then a generator expression is usually preferred. To get the number of items a generator would return, you can use sum() like this:
>
>>>> gen = (n for n in xrange(some_really_huge_number))
>>>> sum(1 for n in gen) # outputs some_really_huge_number


Don't do that. You already know how many items you have, because you created the xrange object:

count = some_really_huge_number


If you didn't create the xrange object yourself, or if you can't easily tell how many items it will include, remember that xrange objects support the len function:

py> x = xrange(23, 1987639292, 17)
py> len(x)
116919957


If you have some unknown, arbitrary iterable that doesn't support len(), then you can use the sum() trick:

it = some_unknown_iterable()
sum(1 for x in it)



There is almost never any reason to write a list comprehension or generator expression that merely walks over an iterable, without doing any further processing:

(x for x in iterable)

is just like iterable, only slower because it is indirect.



-- 
Steven


More information about the Tutor mailing list