Как стать автором
Обновить

Используйте поиск по хешу, а не обыск массива

Высокая производительность *PHP *Алгоритмы *
Перевод
Довольно-таки часто встречается задача: проверить, совпадает ли строка с другими строками из набора. Например, вам нужно проверить каждое слово из сообщения на форуме на предмет того, не содержится ли оно в списке запрещённых. Распространённое решение: создать массив со списком запрещённых слов, а затем с помощью функции in_array() делать проверку. Есть способы повысить производительность такого алгоритма.
Читать дальше →
Всего голосов 63: ↑33 и ↓30 +3
Просмотры 27K
Комментарии 19

PHP: array_key_exists ищет быстрее чем in_array в 500 раз

PHP *Python *
Из песочницы
В 2014 уже писали про обыск массива, но вряд ли кто понял.

C тех пор вышло много версий PHP и не исправили значит обратная связь плохая и об этом мало кто знает. На питоне так же, и в 3* хуже чем в 2.7.

Иногда нужно найти строку в массиве строк — очень частая операция в разных алгоритмах и если массив небольшой и искать немного и не в цикле, то in_array нормально, на общую скорость не влияет, но если big data и искать надо массиве из миллиарда строк и миллиард раз, то это уже критично: лучше час вместо недели.

Простой тест показывает:

in_array ищет за 6-9 сек ideone.com/Yb1mDa 6600ms
а array_key_exists ищет тоже самое, но быстрее в 250(php5.6/py3.*) в 400+ раз (php7.3/py2.7) ideone.com/gwSmFc (цикл увеличен в 100 раз) 12ms (6600/12=550раз +-10% разброс из-за нагрузки и кеша)

Почему же такое происходит? Рассмотрим подробно:
Читать дальше →
Всего голосов 44: ↑18 и ↓26 -8
Просмотры 12K
Комментарии 50