[Python-Dev] Patch #552433
Martin v. Loewis
martin@v.loewis.de
08 May 2002 21:35:05 +0200
Guido van Rossum <guido@python.org> writes:
> I've missed the review of this patch. Why bother special-casing
> tuples? Who's ever going to iterate over a tuple long enough that it
> makes a difference?
Notice that the length of the tuple is not an issue - or rather, the
longer the tuple, the less interesting this change.
When profiling, I found that Python, with iterators, spends a
significant amount of time in allocating IndexError exceptions, so I
thought that patch makes sense. There is also speed to be gained from
accessing the tuple directly (thus bypassing the function call), but
that may not be so relevant.
I have now tried to measure code usage of this change, using two
metrics:
listcount,tuplecount,othercount:
Number of times the list, tuple, and "other" case is taken
listlast,tuplelast,otherlast:
Number of times that the return NULL is taken for each case
I made the following runs:
print "Hello": 1744 149 70
69 60 13
make sharedmods: 14217 2142 447
641 949 60
regrtest.py: 3184596 152384 1170921
134457 49271 15765
PyXML testsuite: 713585 110278 7192
21306 2357 2964
As you can see, the percentage of cases in which iternext is called
for a tuple varies between 3% (regrtest) and 13% (PyXML). However, the
percentage of exhausted tuples compared to other exhausted containers
varies between 8% (PyXML) and 61% (make sharedmods).
So it appears that a significant fraction of the exhausted containers are
indeed tuples, justifying the special-casing.
Regards,
Martin