[issue23419] Faster default __reduce__ for classes without __init__
Serhiy Storchaka added the comment: For a namedtuple such as turtle.Vec2D there is no significant difference in the time of unpickling. But for simpler type it is. $ ./python -m timeit -s 'import pickle, turtle; global I' -s 'class I(int): pass' -s 'p = pickle.dumps([I(i) for i in range(1000)], 3)' -- 'pickle.loads(p)' Before: 1000 loops, best of 3: 1.6 msec per loop After: 1000 loops, best of 3: 1.82 msec per loop So I withdraw my patch. Unpickling performance is more important than pickling performance, and status quo wins. Sorry for the noise. -- assignee: - serhiy.storchaka resolution: - rejected stage: patch review - resolved status: open - closed ___ 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
[issue23419] Faster default __reduce__ for classes without __init__
Amaury Forgeot d'Arc added the comment: But isn't the result different? NEWOBJ calls cls.__new__() and __init__ is skipped. REDUCE calls cls(): both __new__ and __init__ are used. -- nosy: +amaury.forgeotdarc ___ 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
[issue23419] Faster default __reduce__ for classes without __init__
Amaury Forgeot d'Arc added the comment: Sorry, I missed the important point: for classes without __init__ -- ___ 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
[issue23419] Faster default __reduce__ for classes without __init__
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: cGLOBAL 'turtle Vec2D' 16: KBININT112 18: KBININT134 20: \x86 TUPLE2 21: \x81 NEWOBJ 22: .STOP After: 0: \x80 PROTO 3 2: cGLOBAL 'turtle Vec2D' 16: KBININT112 18: KBININT134 20: \x86 TUPLE2 21: RREDUCE 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