bpo-35664: Optimize operator.itemgetter by rhettinger · Pull Request #11435 · python/cpython

---------------- Baseline -------------------------------------
$ git status | head -2
On branch master
Your branch is up to date with 'upstream/master'.
$ ./python.exe -m timeit -r11 -s 'from operator import itemgetter' -s 'g0 = itemgetter(0)' -s 't = ("tom", "sue")' 'g0(t)'
5000000 loops, best of 11: 65.5 nsec per loop
$ ./python.exe -m timeit -r11 -s 'from operator import itemgetter' -s 'g0 = itemgetter(-1)' -s 't = ("tom", "sue")' 'g0(t)'
5000000 loops, best of 11: 70.8 nsec per loop
$ ./python.exe -m timeit -r11 -s 'from operator import itemgetter' -s 'g0 = itemgetter(slice(0,2))' -s 't = ("tom", "sue")' 'g0(t)'
5000000 loops, best of 11: 92.1 nsec per loop
$ ./python.exe -m timeit -r11 -s 'from operator import itemgetter' -s 'g0 = itemgetter(0)' -s 't = ["tom", "sue"]' 'g0(t)'
5000000 loops, best of 11: 66.5 nsec per loop
$ ./python.exe -m timeit -r11 -s 'from operator import itemgetter' -s 'g0 = itemgetter(0)' -s 'class T(tuple): pass'   -s 't =T(["tom", "sue"])' 'g0(t)'
5000000 loops, best of 11: 65.6 nsec per loop
$ ./python.exe -m timeit -r11 -s 'from operator import itemgetter' -s 'g0 = itemgetter(2**61)' -s 't=range(2**62)' 'g0(t)'
2000000 loops, best of 11: 181 nsec per loop
$ ./python.exe -m timeit -r11 -s 'from operator import itemgetter' -s 'g0 = itemgetter(-2**61)' -s 't=range(2**62)' 'g0(t)'
1000000 loops, best of 11: 214 nsec per loop
--------------- Patched ------------------------------------------
$ git status | head -1
On branch optimize_itemgetter
$ ./python.exe -m timeit -r11 -s 'from operator import itemgetter' -s 'g0 = itemgetter(0)' -s 't = ("tom", "sue")' 'g0(t)'
5000000 loops, best of 11: 44.5 nsec per loop
$ ./python.exe -m timeit -r11 -s 'from operator import itemgetter' -s 'g0 = itemgetter(-1)' -s 't = ("tom", "sue")' 'g0(t)'
5000000 loops, best of 11: 61.1 nsec per loop
$ ./python.exe -m timeit -r11 -s 'from operator import itemgetter' -s 'g0 = itemgetter(slice(0,2))' -s 't = ("tom", "sue")' 'g0(t)'
5000000 loops, best of 11: 84.9 nsec per loop
$ ./python.exe -m timeit -r11 -s 'from operator import itemgetter' -s 'g0 = itemgetter(0)' -s 't = ["tom", "sue"]' 'g0(t)'
5000000 loops, best of 11: 55.3 nsec per loop
$ ./python.exe -m timeit -r11 -s 'from operator import itemgetter' -s 'g0 = itemgetter(0)' -s 'class T(tuple): pass'   -s 't =T(["tom", "sue"])' 'g0(t)'
5000000 loops, best of 11: 56.6 nsec per loop
$ ./python.exe -m timeit -r11 -s 'from operator import itemgetter' -s 'g0 = itemgetter(2**61)' -s 't=range(2**62)' 'g0(t)'
2000000 loops, best of 11: 171 nsec per loop
$ ./python.exe -m timeit -r11 -s 'from operator import itemgetter' -s 'g0 = itemgetter(-2**61)' -s 't=range(2**62)' 'g0(t)'
1000000 loops, best of 11: 205 nsec per loop