[Python-Dev] 2.5 slower than 2.4 for some things?

Christian K ckkart at hoc.net
Wed Jun 13 03:15:38 CEST 2007


ocean wrote:
>> I've had a report from a user that Plex runs about half
>> as fast in 2.5 as it did in 2.4. In particular, the
>> NFA-to-DFA conversion phase, which does a lot of
>> messing about with dicts representing mappings between
>> sets of states.

That was me.

>> Does anyone in the Ministry for Making Python Blazingly
>> fast happen to know of some change that might have
>> pessimised things in this area?
> 
> Hello, I investigated. On my environment, consumed time is
> 
> E:\Plex-1.1.5>py24 plex_test2.py
> 0.710999965668
> 
> E:\Plex-1.1.5>py25 plex_test2.py
> 0.921999931335
> 
> And after I applied this patch to Plex/Machines, (make `Node' new style
> class)
> 
> 62c62
> < class Node:
> ---
>> class Node(object):
> 
> E:\Plex-1.1.5>py24 plex_test2.py
> 0.401000022888
> 
> E:\Plex-1.1.5>py25 plex_test2.py
> 0.350999832153
> 

Nice!.

Meanwhile I tried to replace the parsing I did with Plex by re.Scanner. And
again there is a remarkable speed difference. Again python2.5 is slower:

try:
    from re import Scanner
except:
    from sre import Scanner

pars = {}
order = []
count = 0

def par(scanner,name):
    global count, order, pars

    if name in ['caller','e','pi']:
        return name
    if name not in pars.keys():
        pars[name] = ('ns', count)
        order.append(name)
        ret = 'a[%d]'%count
        count += 1
    else:
        ret = 'a[%d]'%(order.index(name))
    return ret

scanner = Scanner([
    (r"x", lambda y,x: x),
    (r"[a-zA-Z]+\.", lambda y,x: x),
    (r"[a-z]+\(", lambda y,x: x),
    (r"[a-zA-Z_]\w*", par),
    (r"\d+\.\d*", lambda y,x: x),
    (r"\d+", lambda y,x: x),
    (r"\+|-|\*|/", lambda y,x: x),
    (r"\s+", None),
    (r"\)+", lambda y,x: x),
    (r"\(+", lambda y,x: x),
    (r",", lambda y,x: x),
    ])

import profile
import pstats

def run():
    arg = '+amp*exp(-(x-pos)/fwhm)'
    for i in range(100):
        scanner.scan(arg)

profile.run('run()','profscanner')
p = pstats.Stats('profscanner')
p.strip_dirs()
p.sort_stats('cumulative')
p.print_stats()


Christian



More information about the Python-Dev mailing list