itertools.ilen?

Terry Reedy tjreedy at udel.edu
Thu Aug 7 09:01:38 CEST 2003


"Jeremy Fincher" <fincher.*@osu.edu> wrote in message
news:bgsqj5$228$1 at news.cis.ohio-state.edu...
> Sometimes I find myself simply wanting the length of an iterator.

An iterator is a function/method that traverses (or possibly
generates) a seqeuence.  The sequence has a length (actual or
potential) but the iterator does not.

>  For example, to collect some (somewhat useless ;))
>  statistics about a program  of mine, I've got code like this:
>
>         objs = gc.get_objects()
>         classes = len([obj for obj in objs if inspect.isclass(obj)])
>         functions = len([obj for obj in objs if
inspect.isroutine(obj)])
>         modules = len([obj for obj in objs if
inspect.ismodule(obj)])
>         dicts = len([obj for obj in objs if type(obj) ==
types.DictType])
>         lists = len([obj for obj in objs if type(obj) ==
types.ListType])
>         tuples = len([obj for obj in objs if type(obj) ==
types.TupleType])

Alternative: initialize six counters to 0.  Scan list once and update
appropriate counter.

> Now, obviously I can (and will, now that 2.3 is officially released
:))
> replace the list comprehensions with itertools.ifilter, but I need
an
> itertools.ilen to find the length of such iterators.

You mean the associated sequence.

> I can imagine such a need arises in more useful situations than
this, but
> this is the particular case that brought the need to mind.
>
> The Python code is simple, obviously:
>
> def ilen(iterator):
>     i = 0
>     for _ in iterator:
>         i += 1
>     return i
>
> But it's a pity to use itertools' super-fast iterators and have to
use slow,
> raw Python to determine their length :)

If you mean a c-coded counter (which would not be an iterator itself)
equivalent to the above, that could be done.  Perhaps len() could be
upgraded/extended to accept an iterator and count when it can't get a
__len__ method to call.  The main downside is that iterators are
sometimes destructive (run once only).

In the meanwhile, is this really a bottleneck for you? or merely the
'pity' of a program running in 1 sec when 0.1 is possible?

Terry J. Reedy






More information about the Python-list mailing list