Согласно этому вопросу и этому ответу списки реализованы в виде массивов:
Perl реализует списки с массивом и смещением первого / последнего элемента,Массив выделяется больше, чем необходимо, смещения, изначально указывающие на середину массива, так что есть место для роста в обоих направлениях (unshifts и push / вставки), прежде чем потребуется перераспределение базового массива.Следствием этой реализации является то, что все операторы примитивного списка perl (вставка, выборка, определение размера массива, push, pop, shift, unshift и т. Д.) Выполняются за O (1) раз.
Таким образом, вы ожидаете, что доступ к элементу по числовому смещению будет таким же быстрым, поскольку они представляют собой массивы в реализации, которые обеспечивают очень быструю индексацию в постоянном времени.Однако в сноске в Learning Perl автор говорит, что
Индексирование в массивы не использует сильные стороны Perl.Если вы используете операторы pop, push и аналогичные, которые не используют индексацию, ваш код, как правило, будет работать быстрее, чем если бы вы использовали много индексов, а также избегал ошибок «off-by-one», часто называемых ошибками fencepost.Иногда начинающий программист на Perl (желая посмотреть, как скорость Perl сравнивается с C), скажем, скажем, алгоритм сортировки, оптимизированный для C (со многими операциями индекса массива), переписывает его прямо в Perl (опять же, со многими операциями индекса) иИнтересно, почему это так медленно?Ответ заключается в том, что использование скрипки Страдивари для стучания гвоздей не должно рассматриваться как надежная методика построения.
Как это может быть правдой, если список действительно представляет собой массив под капотом?Я знаю, что просто не в силах сравнить скорость Perl с C, но разве индексирование списка по смещению не будет таким же быстрым, как pop, push или что-то еще?Кажется, они противоречат друг другу.