Самый быстрый Python-эквивалент переключателя для массива целых чисел

Я хочу найти самый быстрый способ выполнить работу переключателя в 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

5
задан Community 23 May 2017 в 11:55
поделиться