[Python-Dev] optimization required: .format() is much slower than %
Christian Heimes
lists at cheimes.de
Tue May 27 00:43:16 CEST 2008
Dear fellow Python developers!
Ten minutes ago I raised a concern about speed differences between the
old style % formatting and the new .format() code. Some quick
benchmarking from Benjamin and me showed, that it's even worse than I
expected.
$ ./python -m timeit "'%s'.format('nothing')"
100000 loops, best of 3: 2.63 usec per loop
$ ./python -m timeit "'%s' % 'nothing'"
10000000 loops, best of 3: 0.188 usec per loop
$ ./python -m timeit "'some text with {0}'.format('nothing')"
100000 loops, best of 3: 4.34 usec per loop
$ ./python -m timeit "'some text with %s' % 'nothing'"
100000 loops, best of 3: 2.04 usec per loop
$ ./python -m timeit "'some text with {0} {1}'.format('nothing', 'more')"
100000 loops, best of 3: 6.77 usec per loop
$ ./python -m timeit "'some text with %s %s' % ('nothing', 'more')"
100000 loops, best of 3: 2.22 usec per loop
As you can clearly see the new .format() code is *much* slower than the
old style % code. I recommend we spend some time on optimizing common
code paths of the new .format() code.
As first step I propose the move the __format__ method to a new type
slot. __format__() is called for every object. My gut feeling says that
a slot method is going to speed up the most common usage
"{0}".format(some_string).
Christian
More information about the Python-Dev
mailing list