[issue23419] Faster default __reduce__ for classes without __init__

2015-03-20 Thread Serhiy Storchaka

Serhiy Storchaka added the comment:

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
After:  1000 loops, best of 3: 1.82 msec per loop

So I withdraw my patch. Unpickling performance is more important than pickling 
performance, and status quo wins. Sorry for the noise.

--
assignee:  - serhiy.storchaka
resolution:  - rejected
stage: patch review - resolved
status: open - closed

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue23419
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue23419] Faster default __reduce__ for classes without __init__

2015-03-19 Thread Amaury Forgeot d'Arc

Amaury Forgeot d'Arc added the comment:

But isn't the result different?
NEWOBJ calls cls.__new__() and __init__ is skipped.
REDUCE calls cls(): both __new__ and __init__ are used.

--
nosy: +amaury.forgeotdarc

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue23419
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue23419] Faster default __reduce__ for classes without __init__

2015-03-19 Thread Amaury Forgeot d'Arc

Amaury Forgeot d'Arc added the comment:

Sorry, I missed the important point:
for classes without __init__

--

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue23419
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue23419] Faster default __reduce__ for classes without __init__

2015-02-09 Thread Serhiy Storchaka

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: cGLOBAL 'turtle Vec2D'
   16: KBININT112
   18: KBININT134
   20: \x86 TUPLE2
   21: \x81 NEWOBJ
   22: .STOP
After:
0: \x80 PROTO  3
2: cGLOBAL 'turtle Vec2D'
   16: KBININT112
   18: KBININT134
   20: \x86 TUPLE2
   21: RREDUCE
   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 rep...@bugs.python.org
http://bugs.python.org/issue23419
___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com