🤷♂️ Снова мы сегодня об оптимизации.
❓ Позавчера Гвидо Ван Россум поднял вопрос над ускорением метода s.startswith("foo")
🦥 Он отметил, что проверка на то, начинается ли строка с заданной подстроки, происходит медленнее при использовании s.startswith("foo"), чем при использовании s[:3] == "foo".
👥 После обсуждения, ускорили за счет макроса METH_FASTCALL. Когда метод определен с помощью этого макроса, CPython генерирует специальный байт-код для более эффективного вызова функции, чем METH_VARARGS, который был до этого, за счет того, что он принимает определенное количество позиционных аргументов.
👉 Например, при использовании METH_VARARGS, CPython должен создать кортеж из всех переданных аргументов, а затем выполнить проверку типов и преобразование каждого аргумента в соответствующий PyObject. С METH_FASTCALL, это становится ненужным, поскольку он предполагает фиксированное количество позиционных аргументов и не требует создания кортежа.
❗️ Однако важно отметить, что использование METH_FASTCALL требует более тщательной работы при определении функций, так как он требует фиксированное количество аргументов, и неправильное количество или типы аргументов могут привести к ошибкам во время выполнения. Эти проверки реализованы в функции unicode_startswith()
🤷♂️ Заодно повысили производительность и для метода endswith(), плюс добавили документацию для него.
0️⃣1️⃣ Также ускорили и для байтовых строк.
👉 Подробнее в телеграм канале https://t.me/cpython_ru
#performance