New submission from Serhiy Storchaka:

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

----------
components: Interpreter Core
messages: 301821
nosy: haypo, serhiy.storchaka
priority: normal
severity: normal
stage: patch review
status: open
title: int.__repr__() is slower than repr()
type: performance
versions: Python 3.7

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue31410>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to