Why is Python 3.1 slower than 2.6 for this code?

Consider the following code (from here , with an increase in the number of tests):

from timeit import Timer

def find_invpow(x,n):
    """Finds the integer component of the n'th root of x,
    an integer such that y ** n <= x < (y + 1) ** n.
    """
    high = 1
    while high ** n < x:
        high *= 2
    low = high/2
    while low < high:
        mid = (low + high) // 2
        if low < mid and mid**n < x:
            low = mid
        elif high > mid and mid**n > x:
            high = mid
        else:
            return mid
    return mid + 1

def find_invpowAlt(x,n):
    """Finds the integer component of the n'th root of x,
    an integer such that y ** n <= x < (y + 1) ** n.
    """
    low = 10 ** (len(str(x)) / n)
    high = low * 10
    while low < high:
        mid = (low + high) // 2
        if low < mid and mid**n < x:
            low = mid
        elif high > mid and mid**n > x:
            high = mid
        else:
            return mid
    return mid + 1

x = 237734537465873465
n = 5
tests = 1000000

print "Norm", Timer('find_invpow(x,n)', 'from __main__ import find_invpow, x,n').timeit(number=tests)
print "Alt", Timer('find_invpowAlt(x,n)', 'from __main__ import find_invpowAlt, x,n').timeit(number=tests)

Using Python 2.6 ( Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) [GCC 4.4.3] on linux2), reported points:

Norm 9.73663210869
Alt 9.53973197937

However, on the same machine using Python 3.1 ( Python 3.1.2 (r312:79147, Apr 15 2010, 15:35:48) [GCC 4.4.3] on linux2), the time is:

Norm 28.4206559658
Alt 26.8007400036

Does anyone know why this code runs three times slower on Python 3.1?

+5
source share
2 answers

My time was steadily decreasing from 2.5, 2.6, 2.7 and 3.1 (Windows XP SP2) ... with the version "/". At //, 3.1 times were significantly less than 2.X times, for example. The "norm" decreased from 6.35 (py2.7) to 3.62 (py3.1).

, 2.x ints ( , 32 64 ) longs ( ). 3.x, long int, int . , long float /.

, "Alt":

high = 1
highpown = 1
while highpown < x:
    high <<= 1
    highpown <<= n
+3

// ( ) 2 3, / python 2 python 3 .

/ //.

+2

All Articles