New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Faster default __reduce__ for classes without __init__ #67607
Comments
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 $ ./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 |
But isn't the result different? |
Sorry, I missed the important point: |
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 So I withdraw my patch. Unpickling performance is more important than pickling performance, and status quo wins. Sorry for the noise. |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: