[Python-Dev] Timing results for scope.py (was Re: Object
finalization for local (ie function) scopes)
Oliver Schoenborn
oliver.schoenborn at utoronto.ca
Sun Jun 13 16:33:13 EDT 2004
I created two functions: one empty and one that opens a file and writes a
line and closes it. I ran once without scope-guard, and once with for each.
Short unscoped (us): 17.485010669
Short and scoped (us): 72.8106022384
Long unscoped (ms): 19.7690964161
Long and scoped (ms): 20.380344323
Here is the code with the tests:
import sys
def ScopeGuarded(func):
return lambda *args, **kwargs: ScopeGuardian(func, *args, **kwargs)
_funcStack = []
def ScopeGuardian(func, *args, **kwargs):
try:
scopedObjs = []
_funcStack.append(scopedObjs)
func(*args, **kwargs)
finally:
_funcStack.pop()
if scopedObjs != []:
scopedObjs.reverse() # destroy in reverse order from creation
for obj in scopedObjs:
obj.finalizeMaster()
def testTimingShort(scoped=False):
def fastFun():
pass
if scoped:
fastFun = ScopeGuarded(fastFun)
fastFun()
def testTimingLong(scoped=False):
def slowFun():
ff = file('asdfaf','w')
ff.write('asdfaf')
ff.close()
if scoped:
slowFun = ScopeGuarded(slowFun)
slowFun()
def testTiming():
from timeit import Timer
tts = Timer('testTimingShort()', 'from __main__ import
testTimingShort')
ttss = Timer('testTimingShort(True)', 'from __main__ import
testTimingShort')
ttl = Timer('testTimingLong()', 'from __main__ import
testTimingLong')
ttls = Timer('testTimingLong(True)', 'from __main__ import
testTimingLong')
tms = tts.timeit(10000)*100
print "Short unscoped (us): ", tms
tmss = ttss.timeit(10000)*100
print "Short and scoped (us):", tmss
tml = ttl.timeit(100)*10
print "Long unscoped (ms): ", tml
tmls = ttls.timeit(100)*10
print "Long and scoped (ms): ", tmls
print "For long, scoped takes %s%% longer than unscoped" %
((tmls/tml-1)*100)
if __name__ == '__main__':
testTiming()
More information about the Python-Dev
mailing list