int() 24 times slower then long() in Python 2.3

Willem willem179 at yahoo.com
Fri Jul 16 06:30:24 EDT 2004


James Henderson <james at logicalprogression.net> wrote in message news:<mailman.426.1089886380.5135.python-list at python.org>...

> As I said before, I don't think the particular code you posted would have 
> worked at all before 2.3.

No, indeed. I tried to make a small program that demonstrates the
problem.
But since you are interested, I have made another more accurate
demonstration of my problem.

Willem

--------------------demonstration---------------------------
# we want to read lots of 32 bit CRC values form a text file
# the numbers are hexadecimal ASCII-strings and have to be
# converted to 32-bit signed integers (which happens to be
# the output of zlib.crc32)
import warnings
from time import clock

# be compatible with Python 2.2 for integer overflow
warnings.filterwarnings ('error', category=OverflowWarning)

# my original 8char-hex to 32bit-int conversion in Python 2.2
# it runs much faster for positive numbers than for negative ones
# but is on average faster then an if-based version
a = -158933416 # an example number, make it positive to see quite
               # different results
b = '%08x' % a # the hex ascii string
print a, b
t1 = clock()
for i in range (10000):
    try: c = int (b, 16)
    except: c = - int (0x100000000 - long (b, 16))
t2 = clock()
print t2 - t1, c, type (c)

# straight forward adaptation to Python 2.3: replace try by if.
# first we set warnings to the default
# (this version does not work in Python 2.2)
warnings.filterwarnings ('ignore', category=OverflowWarning)
t1 = clock()
for i in range (10000):
    c = int (b, 16)
    if c > 0x7fffffff: c = - int (0x100000000 - c)
t2 = clock()
print t2 - t1, c, type (c)

# this adaptation runs 10 times faster then the previous version
# in Python 2.3, but is on average slower than the first version
# in Python 2.2. This is certainly not an obvious adaptation.
# Nobody would expect a long conversion to be, on average, faster
# than an int conversion for 32 bit numbers ...
t1 = clock()
for i in range (10000):
    c = long (b, 16)
    if c > 0x7fffffff: c = - int (0x100000000 - c)
    else: c = int(c)
t2 = clock()
print t2 - t1, c, type (c)



More information about the Python-list mailing list