[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