New submission from Serhiy Storchaka:
Proposed patch makes a number of classes produce more compact pickle data in
common case. This includes iterators of list, tuple, str, bytes, bytearray,
enumerate, array, deque, iterator object for classes with __getitem__, some
itertools iterators, and non-iterator objects: slice, bytearray, deque. This is
achieved by omitting default constructor arguments or state.
Exhausted iterators are pickled as iter(()). This is not new, exhausted bytes,
and bytearray iterators, and reversed list iterator are already pickled as
iter('') or iter([]) correspondingly. iter(()) is just the simplest way to
create an empty iterator and it has the most compact pickle representation.
An example.
Unpatched:
>>> import pickle, pickletools, itertools
>>> len(pickle.dumps(itertools.islice('abcdefgh', 4), 3))
80
>>> len(pickletools.optimize(pickle.dumps(itertools.islice('abcdefgh', 4), 3)))
66
>>> pickletools.dis(pickletools.optimize(pickle.dumps(itertools.islice('abcdefgh',
>>> 4), 3)))
0: \x80 PROTO 3
2: c GLOBAL 'itertools islice'
20: ( MARK
21: c GLOBAL 'builtins iter'
36: X BINUNICODE 'abcdefgh'
49: \x85 TUPLE1
50: R REDUCE
51: K BININT1 0
53: b BUILD
54: K BININT1 0
56: K BININT1 4
58: K BININT1 1
60: t TUPLE (MARK at 20)
61: R REDUCE
62: K BININT1 0
64: b BUILD
65: . STOP
highest protocol among opcodes = 2
Patched:
>>> len(pickle.dumps(itertools.islice('abcdefgh', 4), 3))
69
>>> len(pickletools.optimize(pickle.dumps(itertools.islice('abcdefgh', 4), 3)))
55
>>> pickletools.dis(pickletools.optimize(pickle.dumps(itertools.islice('abcdefgh',
>>> 4), 3)))
0: \x80 PROTO 3
2: c GLOBAL 'itertools islice'
20: c GLOBAL 'builtins iter'
35: X BINUNICODE 'abcdefgh'
48: \x85 TUPLE1
49: R REDUCE
50: K BININT1 4
52: \x86 TUPLE2
53: R REDUCE
54: . STOP
highest protocol among opcodes = 2
----------
components: Extension Modules, Interpreter Core
files: iterators_pickle.diff
keywords: patch
messages: 255699
nosy: alexandre.vassalotti, pitrou, rhettinger, serhiy.storchaka
priority: normal
severity: normal
stage: patch review
status: open
title: More compact pickle of iterators etc
type: enhancement
versions: Python 3.6
Added file: http://bugs.python.org/file41207/iterators_pickle.diff
_______________________________________
Python tracker <[email protected]>
<http://bugs.python.org/issue25776>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com