Мне нужно было найти сумму всех пар чисел в длинном списке пар. В Mathematica есть множество способов сделать это, но я думал об использовании либо Plus
, либо Total
. Поскольку Total
работает со списками, Map
является инструментом функционального программирования для использования там, а Apply
на уровне 1 (@@@) - для Plus
, поскольку Plus
принимает числа, которые нужно добавить, в качестве аргументов.
Вот демонстрационный код ( предупреждение : сохраните всю свою работу перед выполнением этого!):
pairs = Tuples[Range[6000], {2}]; (* toy example *)
TimeConstrained[Plus @@@ pairs; // Timing, 30]
(* Out[4]= {21.73, Null} *)
Total /@ pairs; // Timing
(* Out[5]= {3.525, Null} *)
Вы могли заметить, что я добавил TimeConstrained
в код для Плюс
. Это защитная мера, которую я включил для вас, потому что голый код поставил мой компьютер почти на колени. Фактически, приведенный выше код работает для меня, но если я увеличу диапазон в первой строке до 7000, мой компьютер просто заблокируется и никогда не вернется. Ничего не работает, нет alt-period, переключение программ, ctrl-alt-delete, попытки запустить диспетчер процессов с помощью панели задач, закрытие крышки ноутбука, чтобы он спал и т. Д., На самом деле ничего.
Проблема вызвана чрезмерным использованием памяти строкой Plus @@@ pair
. В то время как сама «пара» занимает около 288 МБ, а список составляет половину от этого объема, линейка Plus быстро потребляет около 7 ГБ для своих вычислений. Это конец моей свободной физической памяти, и все, что больше, вызывает использование виртуальной памяти на диске. И Mathematica и / или Windows, очевидно, плохо работают при использовании виртуальной памяти (кстати, MacOS и Linux ведут себя лучше?). Напротив,строка Total не оказывает заметного влияния на график использования памяти.
У меня два вопроса:
Plus
и Total
, как указано в документация ( «Всего [список] эквивалентно Применить [Плюс, список].» ) как объяснить крайнюю разницу в поведении? Я предполагаю, что это связано с различиями между Apply
и Map
, но мне любопытны задействованные внутренние механизмы. MemoryConstrained
, но мучительно использовать ее везде, где вы подозреваете, что Mathematica может захватить все ваши системные ресурсы. Есть ли глобальный параметр, который я могу использовать, чтобы указать Mathematica использовать только физическую память (или, желательно, определенную часть ее) для всех своих операций? Это было бы чрезвычайно полезно, поскольку такое поведение привело к нескольким зависаниям за последние пару недель, и это действительно начинает меня раздражать.