[Tutor] when is a generator "smart?"
Steven D'Aprano
steve at pearwood.info
Sun Jun 2 06:20:25 CEST 2013
On 02/06/13 13:58, Jim Mooney wrote:
> It's a little unclear to me where generators are more efficient.
When there are a lot of items, and you access the items one at a time, not all at once. If there are only a few items, a list or tuple has less overhead and is easier to use.
> Below I'm creating a list of non-even squares.
By creating a list, you completely lose any benefit of a generator, since you access all the items in one big list.
> I figured Python would be
> smart enough to see I only wanted a small slice of a large generated
> list,
Nope. The standard CPython implementation is deliberately dumb. Advanced optimizing Python implementations like PyPy *may* be smarter.
There are good reasons why Python *cannot* be very smart about this:
- it cannot tell what list(...) will do until runtime, since "list" is just a name and may be replaced by a different function;
- consequently it cannot tell what the slice [2:10] does until it has built the entire list.
A smarter compiler, like PyPy, *may* be able to tell at runtime that list is the built-in list, and therefore do something special, but that requires a much more complicated compiler. As the reference implementation, CPython is deliberately simple, and will always remain that way.
--
Steven
More information about the Tutor
mailing list