Здесь есть предположение, что наиболее эффективный способ сделать много: "Содержит ли массив X?" проверяет, чтобы преобразовать массив в хэш. Эффективность зависит от ограниченного ресурса, часто времени, а иногда пространства, а иногда и усилий программиста. Вы, по крайней мере, удваиваете объем используемой памяти, сохраняя список и хэш списка одновременно. Кроме того, вы пишете больше оригинального кода, который вам понадобится для тестирования, документирования и т. Д.
В качестве альтернативы обратите внимание на модуль List :: MoreUtils, в частности функции any()
, none()
, true()
и false()
. Все они принимают блок в качестве условия и список в качестве аргумента, аналогично map()
и grep()
:
print "At least one value undefined" if any { !defined($_) } @list;
Я провел быстрый тест, загрузив половину / usr / share / dict / words в массив (25000 слов), а затем искал одиннадцать слов, выбранных по всему словарю (каждому 5000-му слову) в массиве, используя и метод массива в хэш, и функция any()
из List :: MoreUtils.
На Perl 5.8.8, построенном из исходного кода, метод «массив в хеш» работает почти в 1100 раз быстрее, чем метод any()
(в 1300 раз быстрее, чем в упакованном Perl 5.8.7 Ubuntu 6.06).
Однако это еще не все - преобразование массива в хэш занимает около 0,04 секунды, что в этом случае снижает эффективность использования метода массива в хэш-функции в 1,5–2 раза быстрее, чем метод any()
. Все еще хорошо, но не так звездно.
Мне кажется, что метод массива-хеша превзойдет any()
в большинстве случаев, но я чувствовал бы себя намного лучше, если бы у меня были более надежные метрики (много тестов, приличная статистика анализ, может быть, какой-то большой алгоритмический анализ каждого метода и т. д.) В зависимости от ваших потребностей, List :: MoreUtils может быть лучшим решением; это, конечно, более гибкий и требует меньше кодирования. Помните, преждевременная оптимизация - это грех ...:)