[Python-Dev] Comparison speed (original) (raw)

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