Скорость индексации массивов Perl по смещению

Согласно этот вопрос и этот ответ , списки реализованы как массивы:

Perl реализует списки с массивом и смещения первого / последнего элемента. В массив выделяется больше, чем необходимо с исходными смещениями в середине массива, поэтому есть возможность расти в обоих направлениях (сдвигает и толкает / вставляет) перед перераспределение базового массива необходимо. Следствие этого реализация заключается в том, что все Perl примитивные операторы списка (вставка, выборка, определение размера массива, push, pop, shift, unshift и т. д.) выполняются за время O (1).

Таким образом, вы ожидаете, что доступ к элементу по числовому смещению будет столь же быстрым, потому что в реализации они являются массивами, которые обеспечивают очень быструю индексацию с постоянным временем. Однако в сноске в Learning Perl автор говорит, что

Индексирование в массивы не использует Сильные стороны Perl. Если вы используете поп, push и подобные операторы, которые избегают используя индексацию, ваш код будет обычно будет быстрее, чем если бы вы использовали много индексов, а также избегая «Отдельные ошибки», часто называемые Ошибки «столба забора». Иногда начинающий программист Perl (желающий посмотрите, как скорость Perl сравнивается с C) возьмет, скажем, алгоритм сортировки оптимизирован для C (со многими индексами массива операции), перепишите его прямо в Perl (опять же, с много операций с индексами) и интересно, почему это так медленно. Ответ заключается в том, что использование скрипка Страдивари, чтобы забивать ногти не следует считать звуком техника построения.

Как это может быть правдой, если список на самом деле представляет собой скрытый массив? Я знаю, что просто невежественно пытаться сравнить скорость Perl с C, но разве индексирование списка по смещению не будет таким же быстрым, как pop, push или что-то еще? Кажется, что они противоречат друг другу.

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