per-function jit compiler

  • Thread starter Luis M. González
  • Start date
L

Luis M. González

This post gave me an idea: http://groups.google.com/group/comp.lang.python/msg/5d75080707104b76

What if I write a simple decorator to figure out the types of every
function, and then we use it as a base for a simple method-jit
compiler for python?

example:

def typer(f):
def wrap(*args):
a = f.func_code.co_varnames
b = [type(i) for i in args]
return dict(zip(a,b))
return wrap

@typer
def spam(a, b, c=3, d=4):
pass
{'a': <type 'int'>, 'c': <type 'float'>, 'b': <type 'str'>, 'd':<type
'int'>}

So by using this information, we record all the argument types used
the first time each function/method is executed, and then we generate
optimized code for them.
From this point on, a guard should check if all arguments remain the
same and, if so, the optimized code is run.
Otherwise, just fall back to the interpreter.

He! I have no idea how to implement it...
Any guru out there?
Luis
 
C

Chris Rebert

2010/4/5 Luis M. González said:
This post gave me an idea: http://groups.google.com/group/comp.lang.python/msg/5d75080707104b76

What if I write a simple decorator to figure out the types of every
function, and then we use it as a base for a simple method-jit
compiler for python?

example:

def typer(f):
       def wrap(*args):
           a = f.func_code.co_varnames
           b = [type(i) for i in args]
           return dict(zip(a,b))
       return wrap

@typer
def spam(a, b, c=3, d=4):
       pass
{'a': <type 'int'>, 'c': <type 'float'>, 'b': <type 'str'>, 'd':<type
'int'>}

So by using this information, we record all the argument types used
the first time each function/method is executed, and then we generate
optimized code for them.
From this point on, a guard should check if all arguments remain the
same and, if so, the optimized code is run.
Otherwise, just fall back to the interpreter.

He! I have no idea how to implement it...

Guido's been lending out his time machine again:
http://psyco.sourceforge.net/introduction.html

Cheers,
Chris
 
L

Luis M. González

2010/4/5 Luis M. González <[email protected]>:




What if I write a simple decorator to figure out the types of every
function, and then we use it as a base for a simple method-jit
compiler for python?

def typer(f):
       def wrap(*args):
           a = f.func_code.co_varnames
           b = [type(i) for i in args]
           return dict(zip(a,b))
       return wrap
@typer
def spam(a, b, c=3, d=4):
       pass
{'a': <type 'int'>, 'c': <type 'float'>, 'b': <type 'str'>, 'd':<type
'int'>}
So by using this information, we record all the argument types used
the first time each function/method is executed, and then we generate
optimized code for them.
same and, if so, the optimized code is run.
Otherwise, just fall back to the interpreter.
He! I have no idea how to implement it...

Guido's been lending out his time machine again:http://psyco.sourceforge.net/introduction.html

Cheers,
Chris
--http://blog.rebertia.com

Well, psyco is a complex beast. Actually it's a Just-In-Time
Specializer, not really a compiler at all (Guido's machine told me
so).
It's been superseded by pypy, which is a way more complex beast, and
it's a tracing compiler (and many things more).
What I mean is, why not using python's simple introspection
capabilities (instead of partial evaluation, type inference or other
complex mechanism) to gather type information?
I can imagine that this, coupled with pyrex, cython or shedskin could
give some results perhaps... by selectively compiling some function or
all of them.

But probably someone will throw Guido's time machine again at me. If
it was that easier, someone would have done it already...
I just wonder why this simple approach is not feasible.

Luis
 
G

Gabriel Genellina

2010/4/5 Luis M. González <[email protected]>:




This post gave me an idea:http://groups.google.com/group/comp.lang.python/msg/5d75080707104b76

What if I write a simple decorator to figure out the types of every
function, and then we use it as a base for a simple method-jit
compiler for python?

def typer(f):
def wrap(*args):
a = f.func_code.co_varnames
b = [type(i) for i in args]
return dict(zip(a,b))
return wrap
@typer
def spam(a, b, c=3, d=4):
pass
spam(8,'hello',9.9, 10)
{'a': <type 'int'>, 'c': <type 'float'>, 'b': <type 'str'>, 'd':<type
'int'>}
So by using this information, we record all the argument types used
the first time each function/method is executed, and then we generate
optimized code for them.
From this point on, a guard should check if all arguments remain the
same and, if so, the optimized code is run.
Otherwise, just fall back to the interpreter.
He! I have no idea how to implement it...

Guido's been lending out his time machine
again:http://psyco.sourceforge.net/introduction.html

Well, psyco is a complex beast. Actually it's a Just-In-Time
Specializer, not really a compiler at all (Guido's machine told me
so).
It's been superseded by pypy, which is a way more complex beast, and
it's a tracing compiler (and many things more).
What I mean is, why not using python's simple introspection
capabilities (instead of partial evaluation, type inference or other
complex mechanism) to gather type information?
I can imagine that this, coupled with pyrex, cython or shedskin could
give some results perhaps... by selectively compiling some function or
all of them.

That *is* exactly what psyco does. A specialized function (or block) is a
pre-compiled block with a known combination of variable types, detected at
runtime.
psyco has not been superseded by pypy, they're two separate projects.
(psyco's author focus has migrated, though).
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,982
Messages
2,570,186
Members
46,742
Latest member
AshliMayer

Latest Threads

Top