logging.diff (original) (raw)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
[ Show hidden characters]({{ revealButtonHref }})
vinay@eta-jaunty:~/projects/scratch$ python3.2 timefc.py |
---|
filename_comparison 50.61 microseconds |
module_globals 49.56 microseconds |
vinay@eta-jaunty:~/projects/scratch$ python2.7 timefc.py |
filename_comparison 50.79 microseconds |
module_globals 50.01 microseconds |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
[ Show hidden characters]({{ revealButtonHref }})
Index: Lib/logging/__init__.py |
---|
=================================================================== |
--- Lib/logging/__init__.py (revision 85055) |
+++ Lib/logging/__init__.py (working copy) |
@@ -89,6 +89,16 @@ |
# _srcfile = None |
# |
+# An alternative approach to finding the caller is to use module globals |
+# to determine whether we're in inside logging code. |
+# |
+# Let's also have a flag _useglobals which determines whether or not to |
+# use this strategy - it allows us to compare more easily the performance |
+# of the two approaches. |
+ |
+_useglobals = False |
+ |
+# |
#_startTime is used as the base when calculating the relative time of events |
# |
_startTime = time.time() |
@@ -1199,20 +1209,28 @@ |
Find the stack frame of the caller so that we can note the source |
file name, line number and function name. |
""" |
+ rv = "(unknown file)", 0, "(unknown function)" |
f = currentframe() |
- #On some versions of IronPython, currentframe() returns None if |
- #IronPython isn't run with -X:Frames. |
- if f is not None: |
- f = f.f_back |
- rv = "(unknown file)", 0, "(unknown function)" |
- while hasattr(f, "f_code"): |
- co = f.f_code |
- filename = os.path.normcase(co.co_filename) |
- if filename == _srcfile: |
+ if _useglobals: |
+ globs = globals() |
+ while f is not None and f.f_globals is globs: |
f = f.f_back |
- continue |
- rv = (filename, f.f_lineno, co.co_name) |
- break |
+ if f is not None: |
+ co = f.f_code |
+ rv = (co.co_filename, f.f_lineno, co.co_name) |
+ else: |
+ #On some versions of IronPython, currentframe() returns None if |
+ #IronPython isn't run with -X:Frames. |
+ if f is not None: |
+ f = f.f_back |
+ while hasattr(f, "f_code"): |
+ co = f.f_code |
+ filename = os.path.normcase(co.co_filename) |
+ if filename == _srcfile: |
+ f = f.f_back |
+ continue |
+ rv = (co.co_filename, f.f_lineno, co.co_name) |
+ break |
return rv |
def makeRecord(self, name, level, fn, lno, msg, args, exc_info, func=None, extra=None): |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
[ Show hidden characters]({{ revealButtonHref }})
#!/usr/bin/env python |
---|
# Time different findCaller strategies. |
import logging |
import timeit |
logger = logging.getLogger() |
def filename_comparison(): |
logger.info('This is a test for filename comparison') |
def module_globals(): |
logger.info('This is a test for module globals') |
def do_timing(func): |
t = timeit.Timer(func) |
elapsed = t.timeit(number=1000000) |
print("%-20s %5.2f microseconds" % (func.__name__, elapsed)) |
def main(): |
logging.basicConfig(level=logging.INFO, filename="timefc.log", filemode="w", format="%(funcName)s %(filename)s %(lineno)d %(message)s") |
do_timing(filename_comparison) |
logging._useglobals = True |
do_timing(module_globals) |
if __name__ == "__main__": |
main() |