trials = [1] * 500 def make_nonlocal_writer(): v_nonlocal = 1 def inner(trials=trials): nonlocal v_nonlocal # this is invalid syntax in Py2.x for t in trials: v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1 v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1 v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1 v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1 v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1; v_nonlocal = 1 inner.__name__ = 'write_nonlocal' return inner write_nonlocal = make_nonlocal_writer() def make_nonlocal_deleter(): v_nonlocal = 1 def inner(trials=trials): nonlocal v_nonlocal # this is invalid syntax in Py2.x for t in trials: v_nonlocal = 1; del v_nonlocal; v_nonlocal = 1; del v_nonlocal; v_nonlocal = 1; del v_nonlocal; v_nonlocal = 1; del v_nonlocal; v_nonlocal = 1; del v_nonlocal v_nonlocal = 1; del v_nonlocal; v_nonlocal = 1; del v_nonlocal; v_nonlocal = 1; del v_nonlocal; v_nonlocal = 1; del v_nonlocal; v_nonlocal = 1; del v_nonlocal v_nonlocal = 1; del v_nonlocal; v_nonlocal = 1; del v_nonlocal; v_nonlocal = 1; del v_nonlocal; v_nonlocal = 1; del v_nonlocal; v_nonlocal = 1; del v_nonlocal v_nonlocal = 1; del v_nonlocal; v_nonlocal = 1; del v_nonlocal; v_nonlocal = 1; del v_nonlocal; v_nonlocal = 1; del v_nonlocal; v_nonlocal = 1; del v_nonlocal v_nonlocal = 1; del v_nonlocal; v_nonlocal = 1; del v_nonlocal; v_nonlocal = 1; del v_nonlocal; v_nonlocal = 1; del v_nonlocal; v_nonlocal = 1; del v_nonlocal inner.__name__ = 'write_delete_nonlocal' return inner delete_nonlocal = make_nonlocal_deleter() def make_nonlocal_concatenater(): v_nonlocal = b'unique'.decode() def inner(trials=trials): nonlocal v_nonlocal # this is invalid syntax in Py2.x for t in trials: v_nonlocal = v_nonlocal + ''; v_nonlocal = v_nonlocal + ''; v_nonlocal = v_nonlocal + ''; v_nonlocal = v_nonlocal + ''; v_nonlocal = v_nonlocal + '' v_nonlocal = v_nonlocal + ''; v_nonlocal = v_nonlocal + ''; v_nonlocal = v_nonlocal + ''; v_nonlocal = v_nonlocal + ''; v_nonlocal = v_nonlocal + '' v_nonlocal = v_nonlocal + ''; v_nonlocal = v_nonlocal + ''; v_nonlocal = v_nonlocal + ''; v_nonlocal = v_nonlocal + ''; v_nonlocal = v_nonlocal + '' v_nonlocal = v_nonlocal + ''; v_nonlocal = v_nonlocal + ''; v_nonlocal = v_nonlocal + ''; v_nonlocal = v_nonlocal + ''; v_nonlocal = v_nonlocal + '' v_nonlocal = v_nonlocal + ''; v_nonlocal = v_nonlocal + ''; v_nonlocal = v_nonlocal + ''; v_nonlocal = v_nonlocal + ''; v_nonlocal = v_nonlocal + '' inner.__name__ = 'concat_nonlocal' return inner concat_nonlocal = make_nonlocal_concatenater() def make_nonlocal_iconcatenater(): v_nonlocal = b'unique'.decode() def inner(trials=trials): nonlocal v_nonlocal # this is invalid syntax in Py2.x for t in trials: v_nonlocal += ''; v_nonlocal += ''; v_nonlocal += ''; v_nonlocal += ''; v_nonlocal += '' v_nonlocal += ''; v_nonlocal += ''; v_nonlocal += ''; v_nonlocal += ''; v_nonlocal += '' v_nonlocal += ''; v_nonlocal += ''; v_nonlocal += ''; v_nonlocal += ''; v_nonlocal += '' v_nonlocal += ''; v_nonlocal += ''; v_nonlocal += ''; v_nonlocal += ''; v_nonlocal += '' v_nonlocal += ''; v_nonlocal += ''; v_nonlocal += ''; v_nonlocal += ''; v_nonlocal += '' inner.__name__ = 'iconcat_nonlocal' return inner iconcat_nonlocal = make_nonlocal_iconcatenater() #import dis #dis.dis(concat_nonlocal) #dis.dis(iconcat_nonlocal) def loop_overhead(trials=trials): for t in trials: pass if __name__=='__main__': from timeit import Timer for f in [write_nonlocal, delete_nonlocal, concat_nonlocal, iconcat_nonlocal, loop_overhead]: print('{:5.3f}\t{}'.format(min(Timer(f).repeat(7, 1000)), f.__name__))