[Python-Dev] Comparison speed

Tim Peters tim@digicool.com
Mon, 14 May 2001 16:12:44 -0400


Here's a simple test program:

from time import clock

indices = [1] * 100000

def doit():
    s = clock()
    i = 0
    while i < 100000:
        "ab" < "cd"
        i += 1
    f = clock()
    return f - s

for i in xrange(10):
    print "%.3f" % doit()

And here's output from 2.0, 2.1 and current CVS:

C:\Code\python\dist\src\PCbuild>\python20\python timech.py
0.107
0.106
0.109
0.106
0.106
0.106
0.106
0.106
0.105
0.106

C:\Code\python\dist\src\PCbuild>\python21\python timech.py
0.118
0.118
0.117
0.118
0.117
0.118
0.117
0.118
0.117
0.118

C:\Code\python\dist\src\PCbuild>python timech.py
0.119
0.117
0.118
0.117
0.118
0.117
0.118
0.117
0.118

So "something happened" between 2.0 and 2.1 to slow this overall by 10%.
string_compare hasn't changed, so rich comparisons are a good guess.  Note
that the more obvious timing loop obscures the issue:

def doit():
    s = clock()
    for i in indices:
        "ab" < "cd"
    f = clock()
    return f - s

C:\Code\python\dist\src\PCbuild>\python20\python timech.py
0.070
0.069
0.069
0.070
0.069
0.069
0.069
0.070
0.069
0.069

C:\Code\python\dist\src\PCbuild>\python21\python timech.py
0.076
0.076
0.076
0.076
0.076
0.077
0.076
0.076
0.076
0.076

C:\Code\python\dist\src\PCbuild>python timech.py
0.069
0.070
0.070
0.069
0.069
0.070
0.070
0.069
0.070
0.069

for-loops are faster in current CVS than in 2.0 or 2.1, and that cancels out
the comparison slowdown.

If we try it with a type of comparison that avoids the richcmp machinery
(int < int is special-cased in ceval), current CVS is actually faster than
2.0:

def doit():
    s = clock()
    for i in indices:
        2 < 3
    f = clock()
    return f - s

C:\Code\python\dist\src\PCbuild>\python20\python timech.py
0.056
0.056
0.056
0.056
0.055
0.056
0.058
0.058
0.055
0.056

C:\Code\python\dist\src\PCbuild>\python21\python timech.py
0.059
0.059
0.059
0.060
0.060
0.059
0.059
0.060
0.059
0.059

C:\Code\python\dist\src\PCbuild>python timech.py
0.053
0.052
0.052
0.053
0.053
0.052
0.052
0.054
0.052
0.053

C:\Code\python\dist\src\PCbuild>

This also shows that 2.1 was a bit more slothful than 2.0 for some reason
other than richcmps.

These were all done on a Win2K box; timings vary too much on a Win9x box to
be useful.

Anybody care to take a stab at making the new richcmp and/or coerce code
ugly again?

speed-isn't-pretty-but-then-guts-rarely-are-ly y'rs  - tim