[Python-ideas] Introduce collections.Reiterable
Steven D'Aprano
steve at pearwood.info
Tue Sep 24 06:21:05 CEST 2013
On Tue, Sep 24, 2013 at 12:42:18PM +0900, Stephen J. Turnbull wrote:
> Steven D'Aprano writes:
>
> > A lot of work for virtually no benefit. Besides, who said that infinite
> > iterators are common?
>
> Infinite, no. Don't know the length until you're done, common.
Which is why iterators don't require a length. Another way of spelling
"length is unknown" is "object has no __len__".
> Length nondeterministic and in principle unbounded, common.
Maybe it's the mathematician in me speaking, but I don't think very many
unbounded iterators are found outside of maths sequences. After all,
even if you were to iterate over every atom in the universe, that would
be bounded, and quite small compared to some of the numbers
mathematicians deal with... :-)
> > If you care about infinite iterators, you can add your own "isinfinite"
> > flag on them. Personally, I wouldn't bother. I just consider this a case
> > for programming by contract: unless the function you are calling
> > promises to be safe with infinite iterators, you should not use them.
>
> But finite iterators can cause problems too (eg, Nick's length=1google
> range -- even with an attosecond processor, that will take a while to
> exhaust :-). It would be nice if a program could choose its own value
> of "too big", and process "large finite" and "infinite" lists in the
> same way by taking "as much as possible".
You can already do that, although it requires a bit of manual work
and preperation. Within Python, you can use itertools.islice, and take
slices of everything to limit the number of items processed:
process(islice(some_iterator, MAXIMUM))
Or you can use your operating system to manage resource limits, e.g. on
Linux systems ulimit -v seems to work for me:
py> def big():
... while True:
... yield 1
...
py> list(big())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
MemoryError
It would be nice if Python allowed you to tune memory consumption within
Python itself, but failing that, that's what the OS is for.
Mind you, I have repeatedly been bitten by accidently calling list() on
a too large iterator. So I'm sympathetic to the view that this is a hard
problem to solve and Python should help solve it.
--
Steven
More information about the Python-ideas
mailing list