Message301821
Following the StackOverflow question [1].
Calling repr() is faster than calling unbound method __repr__(). This looks strange at first glance because it is *obvious* that repr() is implemented via calling __repr__().
$ ./python -m timeit "''.join(map(repr, range(10000)))"
500 loops, best of 5: 809 usec per loop
$ ./python -m timeit "''.join(map(int.__repr__, range(10000)))"
200 loops, best of 5: 1.27 msec per loop
Actually repr() just called the tp_repr slot, while calling int.__repr__ passes through many intermediate layers.
Proposed PR gets rid of a half of the overhead. It avoids creating and calling an itermediate function object. The result still is slower then calling repr().
$ ./python -m timeit "''.join(map(int.__repr__, range(10000)))"
200 loops, best of 5: 1.01 msec per loop
The PR also speeds up calling classmethod descriptors.
$ ./python -m timeit -s "cm = bytes.fromhex; args = [('',)]*10000; from itertools import starmap" -- "b''.join(starmap(cm, args))"
500 loops, best of 5: 515 usec per loop
$ ./python -m timeit -s "cm = bytes.__dict__['fromhex']; args = [(bytes, '')]*10000; from itertools import starmap" -- "b''.join(starmap(cm, args))"
500 loops, best of 5: 704 usec per loop
Patched:
$ ./python -m timeit -s "cm = bytes.__dict__['fromhex']; args = [(bytes, '')]*10000; from itertools import starmap" -- "b''.join(starmap(cm, args))"
500 loops, best of 5: 598 usec per loop
[1] https://stackoverflow.com/questions/45376719/why-is-reprint-faster-than-strint |
|
Date |
User |
Action |
Args |
2017-09-10 17:34:20 | serhiy.storchaka | set | recipients:
+ serhiy.storchaka, vstinner |
2017-09-10 17:34:20 | serhiy.storchaka | set | messageid: <1505064860.41.0.125310413505.issue31410@psf.upfronthosting.co.za> |
2017-09-10 17:34:20 | serhiy.storchaka | link | issue31410 messages |
2017-09-10 17:34:20 | serhiy.storchaka | create | |
|