Index: psyco_win32/psyco/core.py |
=================================================================== |
--- psyco_win32/psyco/core.py (revision 0) |
+++ psyco_win32/psyco/core.py (revision 0) |
@@ -0,0 +1,231 @@ |
+########################################################################### |
+# |
+# Psyco main functions. |
+# Copyright (C) 2001-2002 Armin Rigo et.al. |
+ |
+"""Psyco main functions. |
+ |
+Here are the routines that you can use from your applications. |
+These are mostly interfaces to the C core, but they depend on |
+the Python version. |
+ |
+You can use these functions from the 'psyco' module instead of |
+'psyco.core', e.g. |
+ |
+ import psyco |
+ psyco.log('/tmp/psyco.log') |
+ psyco.profile() |
+""" |
+########################################################################### |
+ |
+import _psyco |
+import types |
+from support import * |
+ |
+newfunction = types.FunctionType |
+newinstancemethod = types.MethodType |
+ |
+ |
+# Default charge profiler values |
+default_watermark = 0.09 # between 0.0 (0%) and 1.0 (100%) |
+default_halflife = 0.5 # seconds |
+default_pollfreq_profile = 20 # Hz |
+default_pollfreq_background = 100 # Hz -- a maximum for sleep's resolution |
+default_parentframe = 0.25 # should not be more than 0.5 (50%) |
+ |
+ |
+def full(memory=None, time=None, memorymax=None, timemax=None): |
+ """Compile as much as possible. |
+ |
+Typical use is for small scripts performing intensive computations |
+or string handling.""" |
+ import profiler |
+ p = profiler.FullCompiler() |
+ p.run(memory, time, memorymax, timemax) |
+ |
+ |
+def profile(watermark = default_watermark, |
+ halflife = default_halflife, |
+ pollfreq = default_pollfreq_profile, |
+ parentframe = default_parentframe, |
+ memory=None, time=None, memorymax=None, timemax=None): |
+ """Turn on profiling. |
+ |
+The 'watermark' parameter controls how easily running functions will |
+be compiled. The smaller the value, the more functions are compiled.""" |
+ import profiler |
+ p = profiler.ActivePassiveProfiler(watermark, halflife, |
+ pollfreq, parentframe) |
+ p.run(memory, time, memorymax, timemax) |
+ |
+ |
+def background(watermark = default_watermark, |
+ halflife = default_halflife, |
+ pollfreq = default_pollfreq_background, |
+ parentframe = default_parentframe, |
+ memory=None, time=None, memorymax=None, timemax=None): |
+ """Turn on passive profiling. |
+ |
+This is a very lightweight mode in which only intensively computing |
+functions can be detected. The smaller the 'watermark', the more functions |
+are compiled.""" |
+ import profiler |
+ p = profiler.PassiveProfiler(watermark, halflife, pollfreq, parentframe) |
+ p.run(memory, time, memorymax, timemax) |
+ |
+ |
+def runonly(memory=None, time=None, memorymax=None, timemax=None): |
+ """Nonprofiler. |
+ |
+XXX check if this is useful and document.""" |
+ import profiler |
+ p = profiler.RunOnly() |
+ p.run(memory, time, memorymax, timemax) |
+ |
+ |
+def stop(): |
+ """Turn off all automatic compilation. bind() calls remain in effect.""" |
+ import profiler |
+ profiler.go([]) |
+ |
+ |
+def log(logfile='', mode='w', top=10): |
+ """Enable logging to the given file. |
+ |
+If the file name is unspecified, a default name is built by appending |
+a 'log-psyco' extension to the main script name. |
+ |
+Mode is 'a' to append to a possibly existing file or 'w' to overwrite |
+an existing file. Note that the log file may grow quickly in 'a' mode.""" |
+ import profiler, logger |
+ if not logfile: |
+ import os |
+ logfile, dummy = os.path.splitext(sys.argv[0]) |
+ if os.path.basename(logfile): |
+ logfile += '.' |
+ logfile += 'log-psyco' |
+ if hasattr(_psyco, 'VERBOSE_LEVEL'): |
+ print >> sys.stderr, 'psyco: logging to', logfile |
+ # logger.current should be a real file object; subtle problems |
+ # will show up if its write() and flush() methods are written |
+ # in Python, as Psyco will invoke them while compiling. |
+ logger.current = open(logfile, mode) |
+ logger.print_charges = top |
+ profiler.logger = logger |
+ logger.writedate('Logging started') |
+ cannotcompile(logger.psycowrite) |
+ _psyco.statwrite(logger=logger.psycowrite) |
+ |
+ |
+def bind(x, rec=None): |
+ """Enable compilation of the given function, method, or class object. |
+ |
+If C is a class (or anything with a '__dict__' attribute), bind(C) will |
+rebind all functions and methods found in C.__dict__ (which means, for |
+classes, all methods defined in the class but not in its parents). |
+ |
+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(x, types.MethodType): |
+ x = x.im_func |
+ if isinstance(x, types.FunctionType): |
+ if rec is None: |
+ x.func_code = _psyco.proxycode(x) |
+ else: |
+ x.func_code = _psyco.proxycode(x, rec) |
+ return |
+ if hasattr(x, '__dict__'): |
+ funcs = [o for o in x.__dict__.values() |
+ if isinstance(o, types.MethodType) |
+ or isinstance(o, types.FunctionType)] |
+ if not funcs: |
+ raise error, ("nothing bindable found in %s object" % |
+ type(x).__name__) |
+ for o in funcs: |
+ bind(o, rec) |
+ return |
+ raise TypeError, "cannot bind %s objects" % type(x).__name__ |
+ |
+ |
+def unbind(x): |
+ """Reverse of bind().""" |
+ if isinstance(x, types.MethodType): |
+ x = x.im_func |
+ if isinstance(x, types.FunctionType): |
+ try: |
+ f = _psyco.unproxycode(x.func_code) |
+ except error: |
+ pass |
+ else: |
+ x.func_code = f.func_code |
+ return |
+ if hasattr(x, '__dict__'): |
+ for o in x.__dict__.values(): |
+ if (isinstance(o, types.MethodType) |
+ or isinstance(o, types.FunctionType)): |
+ unbind(o) |
+ return |
+ raise TypeError, "cannot unbind %s objects" % type(x).__name__ |
+ |
+ |
+def proxy(x, rec=None): |
+ """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(x, types.FunctionType): |
+ if rec is None: |
+ code = _psyco.proxycode(x) |
+ else: |
+ code = _psyco.proxycode(x, rec) |
+ return newfunction(code, x.func_globals, x.func_name) |
+ if isinstance(x, types.MethodType): |
+ p = proxy(x.im_func, rec) |
+ return newinstancemethod(p, x.im_self, x.im_class) |
+ raise TypeError, "cannot proxy %s objects" % type(x).__name__ |
+ |
+ |
+def unproxy(proxy): |
+ """Return a new copy of the original function of method behind a proxy. |
+The result behaves like the original function in that calling it |
+does not trigger compilation nor execution of any compiled code.""" |
+ if isinstance(proxy, types.FunctionType): |
+ return _psyco.unproxycode(proxy.func_code) |
+ if isinstance(proxy, types.MethodType): |
+ f = unproxy(proxy.im_func) |
+ return newinstancemethod(f, proxy.im_self, proxy.im_class) |
+ raise TypeError, "%s objects cannot be proxies" % type(proxy).__name__ |
+ |
+ |
+def cannotcompile(x): |
+ """Instruct Psyco never to compile the given function, method |
+or code object.""" |
+ if isinstance(x, types.MethodType): |
+ x = x.im_func |
+ if isinstance(x, types.FunctionType): |
+ x = x.func_code |
+ if isinstance(x, types.CodeType): |
+ _psyco.cannotcompile(x) |
+ else: |
+ raise TypeError, "unexpected %s object" % type(x).__name__ |
+ |
+ |
+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 variables |
+# error * the error raised by Psyco |
+# warning * the warning raised by Psyco |
+# __in_psyco__ * a new built-in variable which is always zero, but which |
+# Psyco special-cases by returning 1 instead. So |
+# __in_psyco__ can be used in a function to know if |
+# that function is being executed by Psyco or not. |
Property changes on: psyco_win32\psyco\core.py |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |