Ответ 1
Что вызывает это? Это проблема хеширования?
Да, более или менее.
Исправлено ли это в версии 8?
Да (более или менее). То есть невозможно зафиксировать в каком-либо "полном" смысле. Но наиболее распространенные случаи гораздо лучше обрабатываются.
Есть ли способ узнать, какие имена символов вызывают замедление, отличное от тестирования?
Никоим образом я не знаю.
В версии 7 есть более раннее исправление аналогичного характера с тем, которое было в версии 8. Оно было отключено по умолчанию (у нас не было достаточно времени, чтобы проверить его при отправке, и он не включался для версия 7.0.1). Доступ к нему можно получить следующим образом.
SetSystemOptions["NeedNotReevaluateOptions"->{"UseSymbolLists"->True}];
Это вернет ваш пример в разумный разум.
Module[{weirdness, L}, L = weirdness[];
Do[L = weirdness[L, i], {i, 10^4}]] // Timing
Out [8] = {0.020997, Null}
--- редактировать ---
Я могу объяснить оптимизацию, участвующую здесь чуть более подробно. Сначала напомним, что Mathematica эмулирует "бесконечную оценку", то есть выражения продолжают оценивать, пока они больше не изменятся. Это может быть дорогостоящим и, следовательно, требует тщательной оптимизации короткого замыкания, чтобы предотвратить его, когда это возможно.
Механизм, который мы используем, является вариантом хэширования, который служит для указания того, что символы, от которых зависит зависимость выражения, не изменяются и, следовательно, это выражение не изменяется. Именно здесь могут возникать столкновения, что требует большей работы.
В плохом случае ядру Mathematica, возможно, потребуется пройти все выражение, чтобы определить, что оно не изменилось. Эта прогулка может быть столь же дорогостоящей, как и переоценка. Оптимизация, новая для версии 7 (отмеченная выше), заключается в том, чтобы записывать явно для некоторых типов выражения те символы, от которых это зависит. Затем проверку повторной оценки можно сократить, просто проверив, что ни один из этих символов не был изменен с момента последнего выражения выражения.
Детали реализации немного вовлечены (а также немного запатентованы, хотя, возможно, не так сложно догадаться). Но это, вкратце, то, что происходит под капотом. Более ранние версии иногда делали значительный обход выражения, чтобы обнаружить, что выражение не нуждается в переоценке. Это может произойти, но сейчас это гораздо более редкое событие.
--- конец редактирования ---
Даниэль Лихтблау Wolfram Research