[Python-Dev] Lockstep iteration - eureka!
Tim Peters
tim_one@email.msn.com
Wed, 16 Aug 2000 01:12:21 -0400
[Paul Prescod]
> ...
> I really don't see this "indexing" issue to be common enough
A simple grep (well, findstr under Windows) finds over 300 instances of
for ... in range(len(...
in the .py files on my laptop. I don't recall exactly what the percentages
were when I looked over a very large base of Python code several years ago,
but I believe it was about 1 in 7 for loops.
> for special syntax OR to worry alot about efficiency.
1 in 7 is plenty. range(len(seq)) is a puzzler to newbies, too -- it's
*such* an indirect way of saying what they say directly in other languages.
> Nobody is forcing anyone to use .items().
Agreed, but since seq.items() doesn't exist now <wink>.
> If you want a more efficient way to do it, it's available (just not as
> syntactically beautiful -- same as range/xrangel).
Which way would that be? I don't know of one, "efficient" either in the
sense of runtime speed or of directness of expression. xrange is at least a
storage-efficient way, and isn't it grand that we index the xrange object
with the very integer we're (usually) trying to get it to return <wink>?
The "loop index" isn't an accident of the way Python happens to implement
"for" today, it's the very basis of Python's thing.__getitem__(i)/IndexError
iteration protocol. Exposing it is natural, because *it* is natural.
> ...
> Also, if .keys() returns a range object then theoretically the
> interpreter could recognize that it is looping over a range and optimize
> it at runtime.
Sorry, but seq.keys() just makes me squirm. It's a little step down the
Lispish path of making everything look the same. I don't want to see
float.write() either <wink>.
although-that-would-surely-be-more-orthogonal-ly y'rs - tim