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