Тут існує припущення, що найефективніший спосіб зробити багато "Чи містить масив X?" перевірки полягає у перетворенні масиву в хеш. Ефективність залежить від обмежених ресурсів, часто часу, але іноді місця, а іноді зусиль програміста. Ви принаймні подвоюєте споживану пам'ять, одночасно зберігаючи список і хеш списку. До того ж ви пишете більш оригінальний код, який вам потрібно буде протестувати, задокументувати тощо.
В якості альтернативи, зверніть увагу на модуль Список :: MoreUtils, в зокрема , функції any()
, none()
, true()
і false()
. Усі вони беруть блок як умовний, а список як аргумент, подібний до map()
та grep()
:
print "At least one value undefined" if any { !defined($_) } @list;
Я провів швидкий тест, завантаживши половину / usr / share / dict / слів до масиву (25000 слів), потім шукав одинадцять слів, вибраних із цілого словника (кожне 5000-те слово) у масиві, використовуючи обидва масиву -to-хеш-метод та any()
функція з List :: MoreUtils.
У Perl 5.8.8, побудованому з вихідного коду, метод масиву до хешу працює майже в 1100 разів швидше, ніж any()
метод (на 1300 разів швидший за пакету Perl 5.8.7 Ubuntu 6.06).
Однак це не вся історія - перетворення масиву в хеш займає близько 0,04 секунди, що в цьому випадку знижує ефективність часу методу масиву в хеш в 1,5 рази швидше, ніж any()
метод. Все ще добре, але не настільки зоряне.
Мені здається, що метод масиву до хешу буде перемагати any()
в більшості випадків, але я відчував би себе набагато краще, якби мав кілька твердіших показників (багато тестових випадків, гідний статистичний аналіз, можливо, якийсь великий O алгоритмічний аналіз кожного методу тощо.) Залежно від ваших потреб, List :: MoreUtils може бути кращим рішенням; це, звичайно, більш гнучко і вимагає менше кодування. Пам’ятайте, передчасна оптимізація - це гріх ... :)