[issue23419] Faster default __reduce__ for classes without __init__
Serhiy Storchaka
report at bugs.python.org
Mon Feb 9 12:00:44 CET 2015
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 <report at bugs.python.org>
<http://bugs.python.org/issue23419>
_______________________________________
More information about the Python-bugs-list
mailing list