Имеет ли Python прогноз ветвления?
Я реализовал физическое моделирование в Python (большая часть тяжелой работы в любом случае выполняется в числовых библиотеках, поэтому производительность достаточно хорошая). Теперь, когда проект немного вырос, я добавил дополнительную функциональность через параметры, которые не меняются во время симуляции. При этом возникает необходимость заставить программу делать то или иное на основе их значений, т. Е. Довольно много "если-либо еще", разбросанных по коду.
Мой вопрос прост: реализует ли Python некоторую форму предсказания ветвлений? Собираюсь ли я надевать производительность значительно или переводчик достаточно умен, чтобы видеть, что некоторые параметры никогда не меняются? Имея постоянное if-else внутри функции, которая вызывается миллион раз, выполняется ли условное вычисление каждый раз, или происходит какое-то волшебство? Если нет простого способа полностью удалить условное условие, есть ли способ дать интерпретатору некоторые подсказки и одобрить / эмулировать предсказание ветвления?
1 ответ
Теоретически, вы могли бы извлечь выгоду из некоторых функций JIT, которые могут наблюдать за потоком управления во времени и могут эффективно подавлять неиспользуемые ветви, переставляя код. Некоторые интерпретаторы Python содержат JIT-компиляторы (я думаю, что PyPy делает в более новых версиях, может быть, и Jython), и могут быть в состоянии выполнить эту оптимизацию, но это, конечно, зависит от реального кода.
Однако основная форма предсказания ветвлений выполняется в HW и не связана с SW или используемыми языковыми конструкциями (в случае с Python - довольно много уровней абстракции выше). Этот механизм в конечном итоге наблюдает за этими путями условного кода как ветвями и может быть в состоянии изучить их, если они действительно определены статически. Однако, как и любой механизм прогнозирования, он имеет ограниченную емкость, и, поскольку предполагается, что ваш код большой, он может не соответствовать прогнозам для всех этих ветвей. Это все еще считается довольно хорошим, так что есть вероятность, что критические могут работать.
Наконец, если вы действительно хотите оптимизировать свой код, вы можете преобразовать некоторые из этих условий в константы (присваивая аргументу постоянное значение вместо анализа командной строки) или полностью скрывая условие с помощью чего-то вроде __debug__
, Таким образом, вам не придется беспокоиться о их прогнозировании, но вы можете восстановить возможности с минимальными затратами, если они понадобятся вам в будущем.