Имеет ли Python прогноз ветвления? - PullRequest
0 голосов
/ 26 октября 2018

Я реализовал физическое моделирование в Python (большая часть тяжелой работы в любом случае выполняется в числовых библиотеках, поэтому производительность достаточно хорошая).Теперь, когда проект немного вырос, я добавил дополнительную функциональность с помощью параметров, которые не меняются во время симуляции.При этом возникает необходимость заставить программу делать то или иное на основе их значений, т. Е. Довольно много «если-то еще» разбросано по всему коду.

Мой вопрос прост: реализует ли Python некоторую форму ветвленияпрогноз?Собираюсь ли я надеть производительность значительно или переводчик достаточно умен, чтобы увидеть, что некоторые параметры никогда не меняются?Имея постоянное if-else внутри функции, которая вызывается миллион раз, выполняется ли условное вычисление каждый раз, или происходит какое-то волшебство?Если нет простого способа полностью удалить условное условие, есть ли способ дать интерпретатору некоторые подсказки и одобрить / эмулировать предсказание ветвления?

1 Ответ

0 голосов
/ 29 октября 2018

Теоретически вы могли бы извлечь выгоду из некоторых функций JIT, которые могут наблюдать за потоком управления с течением времени и могут эффективно подавлять неиспользуемые ветви, переставляя код. Некоторые из интерпретаторов Python содержат JIT-компиляторы (я думаю, что PyPy делает в более новых версиях, может быть, и Jython), и могут быть в состоянии выполнить эту оптимизацию, но это, конечно, зависит от реального кода.

Однако основная форма предсказания ветвлений выполняется в HW и не связана с используемыми SW или языковыми конструкциями (в случае с Python - довольно много уровней абстракции выше). Этот механизм в конечном итоге наблюдает за этими условными путями кода как ветвями и может быть в состоянии изучить их, если они действительно определены статически. Однако, как и любой механизм прогнозирования, он имеет ограниченную емкость, и, поскольку предполагается, что ваш код большой, он может не соответствовать прогнозам для всех этих ветвей. Это все еще считается довольно хорошим, так что есть вероятность, что критические могут работать.

Наконец, если вы действительно хотите оптимизировать свой код, вы можете преобразовать некоторые из этих условий в константы (присваивая аргументу постоянное значение вместо синтаксического анализа командной строки) или полностью скрывая условие с помощью чего-то вроде __debug__. Таким образом, вам не придется беспокоиться о их прогнозировании, но вы сможете восстановить возможности с минимальными затратами, если они понадобятся вам в будущем.

...