New submission from Serhiy Storchaka: Proposed patch makes faster default __reduce__ implementation for the case when there is no non-trivial __init__ defined (e.g. for named tuples). In this case __reduce__ will return (cls, newargs) instead of (copyreg.__newobj__, (cls,) + newargs).
>>> pickletools.dis(pickletools.optimize(pickle.dumps(turtle.Vec2D(12, 34), 3))) Before: 0: \x80 PROTO 3 2: c GLOBAL 'turtle Vec2D' 16: K BININT1 12 18: K BININT1 34 20: \x86 TUPLE2 21: \x81 NEWOBJ 22: . STOP After: 0: \x80 PROTO 3 2: c GLOBAL 'turtle Vec2D' 16: K BININT1 12 18: K BININT1 34 20: \x86 TUPLE2 21: R REDUCE 22: . STOP Pickled size is the same, but pickling is faster. The benefit is in avoiding of importing copyreg.__newobj__ and allocating new tuple (cls,) + newargs. Microbenchmarks results: $ ./python -m timeit -s "import pickle; from turtle import Vec2D; a = [Vec2D(i, i+0.1) for i in range(1000)]" -- "pickle.dumps(a)" Before: 100 loops, best of 3: 16.3 msec per loop After: 100 loops, best of 3: 15.2 msec per loop $ ./python -m timeit -s "import copy; from turtle import Vec2D; a = [Vec2D(i, i+0.1) for i in range(1000)]" -- "copy.deepcopy(a)" Before: 10 loops, best of 3: 96.6 msec per loop After: 10 loops, best of 3: 88.7 msec per loop ---------- components: Interpreter Core files: object_reduce_no_init.patch keywords: patch messages: 235600 nosy: alexandre.vassalotti, pitrou, serhiy.storchaka priority: normal severity: normal stage: patch review status: open title: Faster default __reduce__ for classes without __init__ type: performance versions: Python 3.5 Added file: http://bugs.python.org/file38052/object_reduce_no_init.patch _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue23419> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com