Language Shootout

Bengt Richter bokr at accessone.com
Tue Jul 10 21:47:30 EDT 2001


On Tue, 10 Jul 2001 13:54:47 GMT, ullrich at math.okstate.edu (David C.
Ullrich) wrote:

>On Tue, 10 Jul 2001 01:18:16 -0400, "Tim Peters" <tim.one at home.com>
>wrote:
>
>>[Bengt Richter]
>>> ...
>>> I just did a python recursive fib(100000) in
>>> just over 15 seconds, including startup and
which turned out to be mostly str conversion for
the print, so I thought I'd try recursion on that...
(see below ;-)
[...]
>(Took a minute to find fib.py just now, because it was filed 
>under "MatrixTypes". I calculate fib(100000) in 1.7 
>seconds this way; for comparison, str(fib(100000)) takes 
>8.0 seconds.)
Hi Dave ;-)  

Try strL for comparison. It's recursive, and faster than str
for big numbers. I got
 >>> len(strL.strL(ffib(100000)))
 20899

so you can type in 10L**20899 on the command line
for a number in the same ballpark as the fib, for a test.
On my system I get

[18:47] C:\pywk\fib>strL.py str  10L**20899
str took 13.601617 seconds

[18:47] C:\pywk\fib>strL.py strL 10L**20899
strL took  1.044989 seconds

Recursion rides again ;-)

BTW, how do you put everything inside the strL def
to hide names, and how do you recurse inside without
a warning message?

A couple of lines wrapped...
_______________________________________________________________
# strL.py -- recursive long to decimal string conversion
# 2001-07-10 bokr
#
p10d={}
def p10(n):
    if not p10d.has_key(n):
        p = p10d[n] = 10L**n
        return p
    return p10d[n]

def strLR(n,w=0):   # w>0 is known width, w<0 is searching guess
    if w == 0: return []
    if w > 0:
        if w <=9: return [('%0'+chr(w+48)+'d') % n]
        wr = w/2
        nl,nr = divmod(n,p10(wr))
        return strLR(nl,w-wr)+strLR(nr,wr)
    else:
        nl,nr = divmod(n,p10(-w))
        if nl:
            return strLR(nl, 2*w) + strLR(nr,-w)
        else:
            if w >= -9:
                return ['%d' % n]
            else:
                return strLR(nr,w/2)

def strL(n):
    if n<0:
        return ''.join(['-']+strLR(-n,-9))
    else:
        return ''.join(strLR(n,-9))


from time import clock
import sys
def main():
    def pr(x):
        print x

    def psl(x):
        s = strL(x)
        sys.stdout.write(s)
        sys.stdout.write('\n')
        

    dt={'str':str,'strL':strL,'repr':repr, 'print':pr, 'printStrL':psl
}

    try:
        x=long( eval(sys.argv[2]) )
        fn=sys.argv[1]
        fcn=dt[fn]
    except:
        sys.stderr.write("usage: %s [str strL repr print printStrL]
<const expr>\n" % sys.argv[0])
        sys.exit(2)
    
    t0=clock()
    fcn(x)
    t1=clock()
    print "%s took %9.6f seconds" % (fn,t1-t0)

if __name__ == "__main__":
    main()
_______________________________________________________________



More information about the Python-list mailing list