Contact: fumanchu@aminus.org

Log in as guest/geniusql to create tickets

>>> timeit.Timer("b = geniusql.codewalk.EarlyBinder(f); func = b.function()", "import geniusql\nf = lambda x, y, z, **kw: (x.Qty > 1) and ((y.Qty > 20) and (x.Type == 'A'))").timeit(1000)
0.24002429079666854
>>> timeit.Timer("lp = geniusql.astwalk.LambdaParser(f); lp.walk()", "import geniusql\nf = lambda x, y, z, **kw: (x.Qty > 1) and ((y.Qty > 20) and (x.Type == 'A'))").timeit(1000)
0.18212007392003216
>>> 0.18212007392003216 / 0.24002429079666854
0.75875684629899098

>>> timeit.Timer("b = geniusql.codewalk.EarlyBinder(f); func = b.function(); geniusql.codewalk.LambdaDecompiler(func).code()", "import geniusql\nf = lambda x, y, z, **kw: (x.Qty > 1) and ((y.Qty > 20) and (x.Type == 'A'))").timeit(1000)
0.40006069207117889
>>> timeit.Timer("lp = geniusql.astwalk.LambdaParser(f); lp.walk(); geniusql.astwalk.LambdaDeparser(lp.ast).code()", "import geniusql\nf = lambda x, y, z, **kw: (x.Qty > 1) and ((y.Qty > 20) and (x.Type == 'A'))").timeit(1000)
0.28593634107127741
>>> 0.28593634107127741 / 0.40006069207117889
0.7147324062030157

>>> timeit.Timer("b = geniusql.codewalk.EarlyBinder(f); func = b.function(); geniusql.codewalk.LambdaDecompiler(func).code()", "import geniusql\nf = lambda x: x.Qty == 0").timeit(1000)
0.19808893309067344
>>> timeit.Timer("lp = geniusql.astwalk.LambdaParser(f); lp.walk(); geniusql.astwalk.LambdaDeparser(lp.ast).code()", "import geniusql\nf = lambda x: x.Qty == 0").timeit(1000)
0.1344827345375279
>>> .13448 / .1980889
0.67888710573888789

So... AST runs in about 65-75% of the time the equivalent bytecode does, both for parse/compile and deparse/decompile directions.