[Python-Dev] optimization required: .format() is much slower than % (original) (raw)

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