> Here is my attempt to convert the C code, not written with speed in mind
> and I was too lazy too time it.  :-)
>
> from itertools import izip
>
> def pi():
>     result = list()
>     d = 0
>     e = 0
>     f = [2000] * 2801
>     for c in xrange(2800, 0, -14):
>         for b, g in izip(xrange(c, 1, -1), xrange((c * 2) - 1, 0, -2)):
>             d += f[b] * 10000
>             h, f[b] = divmod(d, g)
>             d = h * b
>         h, i = divmod(d, 10000)
>         result.append('%.4d' % (e + h))
>         e = i
>     return ''.join(result)
>

Your version: .36 seconds

It's ugly, but unrolling the divmod into two separate statements is
faster for small operands. The following takes .28 seconds:

from time import clock
from itertools import izip

def pi():
    result = list()
    d = 0
    e = 0
    f = [2000] * 2801
    for c in xrange(2800, 0, -14):
        for b, g in izip(xrange(c, 1, -1), xrange((c * 2) - 1, 0, -2)):
            d += f[b] * 10000
            f[b] = d % g
            h = d // g
            d = h * b
        h, i = divmod(d, 10000)
        result.append('%.4d' % (e + h))
        e = i
    return ''.join(result)

start_time = clock()
pi = pi()
print pi
print "Total time elapsed:", round(clock() - start_time, 2), "s"
print len(pi)

casevh

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to