[Python-Dev] PEP 0424: A method for exposing a length hint
Steven D'Aprano
steve at pearwood.info
Sun Jul 15 17:55:09 CEST 2012
Mark Shannon wrote:
> So how does an iterator express infinite length?
The suggestion was it should return -1.
> What should happen if I am silly enough to do this:
> >>> list(itertools.count())
>
> This will fail; it should fail quickly.
That depends on your OS. I've just tested it now on Linux Mint, and the Python
process was terminated within seconds.
I've also inadvertently done it on a Fedora system, which became completely
unresponsive to user-input (including ctrl-alt-delete) within a few minutes. I
let it run overnight (16 hours) before literally pulling the plug.
(I expect the difference in behaviour is due to the default ulimit under
Debian/Mint and RedHat/Fedora systems.)
Ignoring OS-specific features, the promise[1] of the language is that list
will try to allocate enough space for every item yielded by the iterator, or
fail with a MemoryError. No promise is made as to how long that will take: it
could take hours, or days, depending on how badly memory allocation
performance drops when faced with unreasonably large requests. You can't
expect it to fail either quickly or with an exception.
With a length hint, we could strengthen that promise:
"if __length_hint__ returns a negative number, list, tuple and set will fail
immediately with MemoryError"
which I think is a good safety feature for some things which cannot possibly
succeed, but risk DOSing your system. Does it prevent every possible failure
mode? No, of course not. But just because you can't prevent *every* problem
doesn't mean you should prevent the ones which you can.
[1] I think. I'm sure I read this somewhere in the docs, but I can't find it now.
--
Steven
More information about the Python-Dev
mailing list