New issue 2111: sys.settrace with a local function is about 40x slower than the same function at the top level https://bitbucket.org/pypy/pypy/issues/2111/syssettrace-with-a-local-function-is-about
David MacIver: The following code demonstrates the issue. A trivial tracing function which does nothing doesn't cause much of a slow down when defined at the top level, but when the same function is defined locally it takes much much longer: ``` #!python import sys import random import time def hash_str(s): h = 0 for c in s: h = (h * 31 + ord(c)) & (2 ** 64 - 1) return h random.seed(1) data = [ hex(random.getrandbits(1024)) for _ in range(500) ] def trace_global(frame, event, arg): return trace_global def trace_and_hash_global(d): sys.settrace(trace_global) hash_str(d) sys.settrace(None) def trace_and_hash_local(d): def trace_local(frame, event, arg): return trace_local sys.settrace(trace_local) hash_str(d) sys.settrace(None) if __name__ == '__main__': for ex in [trace_and_hash_global, trace_and_hash_local]: start = time.time() for d in data: ex(d) print(ex.__name__, time.time() - start) ``` For me this prints: ``` ('trace_and_hash_global', 0.07121396064758301) ('trace_and_hash_local', 2.784956932067871) ``` This is running on pypy 2.6.0 on linux. _______________________________________________ pypy-issue mailing list pypy-issue@python.org https://mail.python.org/mailman/listinfo/pypy-issue