Я хочу найти самый быстрый способ выполнить работу переключателя
в C. Я пишу код Python для замены кода C. , и все работает нормально, за исключением узкого места. Этот код используется в замкнутом цикле, поэтому очень важно добиться максимальной производительности.
Попытка опровержения 1: Первая попытка, в соответствии с предыдущими вопросами, такими как , этот предлагает использовать хеш-таблицы для поиска. Это оказалось невероятно медленным.
Попытка опровержения 2
Еще одна оптимизация, которую я сделал, - это создание прогона операторов if ... return
, которые дают мне прирост скорости на 13%. Он по-прежнему удручающе медленный.
Попытка опровержения 3
Я создал array.array
всех возможных входных значений и произвел поиск по индексу. Это приводит к общему ускорению на 43%, что вполне прилично.
Я использую array.array
, используя map
и передаю ему функцию преобразования. Эта функция выполняет поиск. Мой переключатель работает с короткими целыми числами (это типизированный массив). Если бы это был GCC C, компилятор создал бы таблицу переходов. Прискорбно знать, что Python либо хеширует мое значение для поиска записи в таблице, либо, в случае if, выполняет множество сравнений.Из профилирования я знаю, что именно медленные функции выполняют поиск.
Каков самый быстрый способ сопоставления одного целого числа с другим, сопоставленного с array.array
, если это необходимо. Что-нибудь быстрее, чем указано выше?
Хотя это заставляет меня выглядеть идиотом только потому, что я осознал это, я скажу это сразу же! Помните, что запуск вашего кода в профилировщике замедляет ваш код на лот . В моем случае в 19 раз медленнее. Внезапно мое узкое место стало не так уж и плохо! Большое спасибо всем за все ваши ответы. Вопрос все еще в силе. Я ненадолго оставлю вопрос открытым, потому что могут быть интересные ответы.
С профилировщиком, для моего тестового набора данных:
real 0m37.309s
user 0m33.263s
sys 0m4.002s
без:
real 0m2.595s
user 0m2.526s
sys 0m0.028s