Недавно я спросил, почему PatternTest
вызывает множество ненужных оценок: PatternTest не оптимизирован? ] Леонид ответил, что это необходимо для того, что мне кажется довольно сомнительным методом. Я могу согласиться с этим, хотя предпочел бы более эффективную альтернативу.
Теперь я понимаю, и, как мне кажется, Леонид говорил уже некоторое время, что эта проблема гораздо глубже в Mathematica , и я обеспокоен.Я не могу понять, почему это не оптимизировано или не может быть лучше оптимизировано.
Рассмотрим следующий пример:
list = RandomReal[9, 20000];
Head /@ list; // Timing
MatchQ[list, {x__Integer, y__}] // Timing
{0., Null}
{1.014, False}
Проверка заголовков списка происходит мгновенно, но проверка шаблона занимает секунду. Конечно, Mathematica может распознать, что, поскольку первый элемент списка не является целым числом, шаблон не может совпадать, и, в отличие от случая с PatternTest
, я не вижу, как есть какая-либо изменчивость в шаблон. Каково этому объяснение?