Сопоставление с образцом в Mathematica плохо оптимизировано?

Недавно я спросил, почему PatternTest вызывает множество ненужных оценок: PatternTest не оптимизирован? ] Леонид ответил, что это необходимо для того, что мне кажется довольно сомнительным методом. Я могу согласиться с этим, хотя предпочел бы более эффективную альтернативу.

Теперь я понимаю, и, как мне кажется, Леонид говорил уже некоторое время, что эта проблема гораздо глубже в Mathematica , и я обеспокоен.Я не могу понять, почему это не оптимизировано или не может быть лучше оптимизировано.

Рассмотрим следующий пример:

list = RandomReal[9, 20000];
Head /@ list; // Timing
MatchQ[list, {x__Integer, y__}] // Timing
{0., Null}
{1.014, False}

Проверка заголовков списка происходит мгновенно, но проверка шаблона занимает секунду. Конечно, Mathematica может распознать, что, поскольку первый элемент списка не является целым числом, шаблон не может совпадать, и, в отличие от случая с PatternTest , я не вижу, как есть какая-либо изменчивость в шаблон. Каково этому объяснение?


Похоже, существует некоторая путаница в отношении упакованных массивов, которая, насколько я могу судить, не имеет отношения к этому вопросу. Скорее меня интересует временная сложность O (n 2 ) для всех списков, упакованных или распакованных.

13
задан Community 23 May 2017 в 12:01
поделиться