From: Armin R. <ar...@us...> - 2002-02-26 23:06:01
|
Update of /cvsroot/psyco/psyco/psyco In directory usw-pr-cvs1:/tmp/cvs-serv17001 Modified Files: __init__.py classes.py Log Message: reworked selective compilation Index: __init__.py =================================================================== RCS file: /cvsroot/psyco/psyco/psyco/__init__.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** __init__.py 25 Feb 2002 15:24:47 -0000 1.2 --- __init__.py 26 Feb 2002 23:05:57 -0000 1.3 *************** *** 9,34 **** """Psyco, the Python Specializing Compiler ! Step 1. import psyco; psyco.jit() ! This enables transparent just-in-time compilation of the most ! used functions of your programs. Just execute 'psyco.jit()' once. ! Currently only works on global functions, but will be fixed. ! Step 2. from psyco.classes import * ! If you use classes (but not multiple inheritance), the above line ! to put at the beginning of each file defining classes instructs ! Psyco to compile all the methods. Alternatively, you can manually ! select the classes to optimize by having them inherit from ! 'psyco.classes.psyobj'. (Only works on Python >= 2.2; incompatible ! with multiple inheritance.) """ ########################################################################### ! import _psyco, sys, __builtin__ ! __all__ = ['jit'] def jit(tick=5): --- 9,46 ---- """Psyco, the Python Specializing Compiler ! Compile all global functions: ! import psyco; psyco.jit() ! This enables transparent just-in-time compilation of the most ! used functions of your programs. Just execute 'psyco.jit()' once. ! Note that this only works on global functions. ! Compile all class methods: ! from psyco.classes import * ! If you use classes (but not multiple inheritance), the above line ! to put at the beginning of each file defining classes instructs ! Psyco to compile all the methods. Alternatively, you can manually ! select the classes to optimize by having them inherit from ! 'psyco.classes.psyobj'. (Only works on Python >= 2.2; incompatible ! with multiple inheritance.) ! ! Detailled choice of functions to compile: ! psyco.bind(f) ! ! For larger programs, the above solutions are too heavy, as Psyco ! currently does not automatically identify the performance ! bottlenecks. You can trigger the compilation of only the most ! algorithmically intensive functions or classes with psyco.bind(). """ ########################################################################### ! import _psyco, sys, new, __builtin__ ! from types import FunctionType, MethodType ! __all__ = ['error', 'jit', 'bind', 'proxy', 'dumpcodebuf'] + error = _psyco.error def jit(tick=5): *************** *** 37,45 **** _psyco.selective(tick) ! def jit2(tick=5): ! """Enable just-in-time compilation. ! Argument is number of invocations before rebinding.""" ! print '** Warning: jit2 is not working yet' ! _psyco.selective2(tick) # Psyco mode check --- 49,94 ---- _psyco.selective(tick) ! def bind(func, rec=_psyco.DEFAULT_RECURSION): ! """Enable compilation of the given function, method or class. ! In the latter case all methods defined in the class are rebound. ! ! The optional second argument specifies the number of recursive ! compilation levels: all functions called by func are compiled ! up to the given depth of indirection.""" ! if isinstance(func, FunctionType): ! func.func_code = _psyco.proxycode(func) ! elif isinstance(func, MethodType): ! bind(func.im_func, rec) ! elif hasattr(func, '__dict__'): # for classes ! for object in func.__dict__.values(): ! try: ! bind(object, rec) ! except error: ! pass ! ! def proxy(func, rec=_psyco.DEFAULT_RECURSION): ! """Return a Psyco-enabled copy of the function. ! ! The original function is still available for non-compiled calls. ! The optional second argument specifies the number of recursive ! compilation levels: all functions called by func are compiled ! up to the given depth of indirection.""" ! if isinstance(func, FunctionType): ! code = _psyco.proxycode(func) ! return new.function(code, func.func_globals, func.func_name) ! if isinstance(func, MethodType): ! p = proxy(func.im_func, rec) ! return new.instancemethod(p, func.im_self, func.im_class) ! else: ! raise TypeError, 'function or method required' ! ! ! def dumpcodebuf(): ! """Write in file psyco.dump a copy of the emitted machine code, ! provided Psyco was compiled with a non-zero CODE_DUMP. ! See py-utils/httpxam.py to examine psyco.dump.""" ! if hasattr(_psyco, 'dumpcodebuf'): ! _psyco.dumpcodebuf() ! # Psyco mode check Index: classes.py =================================================================== RCS file: /cvsroot/psyco/psyco/psyco/classes.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** classes.py 15 Feb 2002 12:46:37 -0000 1.1 --- classes.py 26 Feb 2002 23:05:57 -0000 1.2 *************** *** 11,15 **** 'psyco.classes.psyobj' is an alternate Psyco-optimized root for classes. Any class inheriting from it or using the metaclass '__metaclass__' might ! get optimized specifically for Psyco. Note that this is not compatible with multiple inheritance and it does --- 11,16 ---- 'psyco.classes.psyobj' is an alternate Psyco-optimized root for classes. Any class inheriting from it or using the metaclass '__metaclass__' might ! get optimized specifically for Psyco. It is equivalent to call instead ! psyco.bind() on the class object after its creation. Note that this is not compatible with multiple inheritance and it does *************** *** 25,29 **** ########################################################################### ! import _psyco __all__ = ['psyobj', 'psymetaclass', '__metaclass__'] --- 26,30 ---- ########################################################################### ! import psyco __all__ = ['psyobj', 'psymetaclass', '__metaclass__'] *************** *** 39,44 **** else: # version >= 2.2 only ! ! FunctionType = type(lambda x: None) recursivity = 5 --- 40,44 ---- else: # version >= 2.2 only ! from types import FunctionType recursivity = 5 *************** *** 48,55 **** def __init__(self, name, bases, dict): type.__init__(self, name, bases, dict) ! for key, value in self.__dict__.items(): ! if isinstance(value, FunctionType): ! setattr(self, key, _psyco.proxy(value, recursivity)) psyobj = psymetaclass("psyobj", (), {}) ! __metaclass__ = psymetaclass --- 48,58 ---- def __init__(self, name, bases, dict): type.__init__(self, name, bases, dict) ! bindlist = self.__dict__.get('__psyco__bind__') ! if bindlist is None: ! psyco.bind(self) ! else: ! for attr in bindlist: ! psyco.bind(self.__dict__.get(attr)) psyobj = psymetaclass("psyobj", (), {}) ! __metaclass__ = psymetaclass |