[New-bugs-announce] [issue22783] Pickle: use NEWOBJ instead of NEWOBJ_EX if possible
Serhiy Storchaka
report at bugs.python.org
Sun Nov 2 16:28:42 CET 2014
New submission from Serhiy Storchaka:
Currently in pickle with protocol 4 the NEWOBJ_EX opcode is used to reconstruct objects with __getnewargs__() or __getnewargs_ex__() even if there no keyword arguments.
>>> import pickle, pickletools, collections
>>> P = collections.namedtuple('P', 'x y')
>>> pickletools.dis(pickle.dumps(P(12, 34), 3))
0: \x80 PROTO 3
2: c GLOBAL '__main__ P'
14: q BINPUT 0
16: K BININT1 12
18: K BININT1 34
20: \x86 TUPLE2
21: q BINPUT 1
23: \x81 NEWOBJ
24: q BINPUT 2
26: . STOP
highest protocol among opcodes = 2
>>> pickletools.dis(pickle.dumps(P(12, 34), 4))
0: \x80 PROTO 4
2: \x95 FRAME 28
11: \x8c SHORT_BINUNICODE '__main__'
21: \x94 MEMOIZE
22: \x8c SHORT_BINUNICODE 'P'
25: \x94 MEMOIZE
26: \x93 STACK_GLOBAL
27: \x94 MEMOIZE
28: K BININT1 12
30: K BININT1 34
32: \x86 TUPLE2
33: \x94 MEMOIZE
34: } EMPTY_DICT
35: \x94 MEMOIZE
36: \x92 NEWOBJ_EX
37: \x94 MEMOIZE
38: . STOP
highest protocol among opcodes = 4
These EMPTY_DICT//MEMOIZE//NEWOBJ_EX can be replaced by single NEWOBJ. Actually there is a regression in protocol 4 against protocol 3, so may be following patch should be applied on 3.4 too.
Here is a patch which uses __newobj__ instead of __newobj_ex__ if there are no keywords arguments. Also it reduce the number of lines of C code and adds tests for classes with __getnewargs__() and __getnewargs_ex__().
----------
components: Library (Lib)
files: pickle_newobj.patch
keywords: patch
messages: 230490
nosy: alexandre.vassalotti, pitrou, serhiy.storchaka
priority: normal
severity: normal
stage: patch review
status: open
title: Pickle: use NEWOBJ instead of NEWOBJ_EX if possible
type: enhancement
versions: Python 3.5
Added file: http://bugs.python.org/file37107/pickle_newobj.patch
_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue22783>
_______________________________________
More information about the New-bugs-announce
mailing list