Микрооптимизации для Python 3.8
Работа над повышением производительности Питона продолжается.
В январе Сергей Сторчака в рамках задачи bpo35582 в функциях, использующих только позиционные аргументы, заменил
Модификация позволила сэкономить на разборе форматных строк и вызовах нескольких уровней функций (что в свою очередь экономит Си-стек). Несмотря на то, что речь идёт о выигрыше в наносекунды, полученные результаты не могут не радовать. Вот замеры прироста производительности некоторых функций после оптимизации:
Стоит поблагодарить Сергея за эту и другую работу, которую он проделал для улучшения CPython.
Кроме того, необходимо также пожелать ему скорейшего восстановления зрения.
Спасибо и здоровья!
_PyArg_ParseStack
и PyArg_ParseTuple
на обработку аргументов внутри самих функций. Модификация позволила сэкономить на разборе форматных строк и вызовах нескольких уровней функций (что в свою очередь экономит Си-стек). Несмотря на то, что речь идёт о выигрыше в наносекунды, полученные результаты не могут не радовать. Вот замеры прироста производительности некоторых функций после оптимизации:
Вызов | Прирост |
---|---|
format('abc') | 35% |
'abc'.replace('x', 'y') | 37% |
'abc'.ljust(5) | 21% |
'abc'.strip() | 11% |
d = {'a': 1}; d.get('a') | 7% |
(1, 2, 3).index(2) | 38% |
a = [1, 2, 3]; a.index(2) | 25% |
math.pow(0.5, 2.0) | 27% |
divmod(5, 2) | 7% |
hasattr(1, 'numerator') | 12% |
getattr(1, 'numerator') | 10% |
isinstance(1, int) | 14% |
gcd(6, 10) | 10% |
add(1, 2) | 20% |
iter(()) | 32% |
it = iter([]); next(it, None) | 17% |
f = attrgetter('numerator'); f(1) | 11% |
f = methodcaller('conjugate'); f(1) | 7% |
Стоит поблагодарить Сергея за эту и другую работу, которую он проделал для улучшения CPython.
Кроме того, необходимо также пожелать ему скорейшего восстановления зрения.
Спасибо и здоровья!
На заметку
Зарегистрированные пользователи могут добавлять Видео.