2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Скорость вычислений в Mathematica
Сообщение03.09.2018, 12:47 
Выполнив следующий код

Код:
f1[n_] := Block[{m = 1, i}, For[i = 1, i <= n, i++, m = m*i]; m]
f2[n_] := Apply[Times, Range[n]]
f3[n_] := Product[i, {i, 1, n}]

Timing[f1[50000];]
Timing[f2[50000];]
Timing[f3[50000];]
Timing[Factorial[50000];]

Получим
Код:
{3.3125, Null}
{0.125, Null}
{0.140625, Null}
{0.03125, Null}


Как видно, скорость выполнения отличается. Если еще и можно предположить, что для команды Factorial имеются заготовленные значения, то почему в остальных случаях время выполнения команды отличается? По сути, нам же надо выполнить умножение $n$ раз.

А если программировать на другом языке программирования, как добиться такой хорошей скорости вычисления факториала?

 
 
 
 Re: Скорость вычислений в Mathematica
Сообщение03.09.2018, 13:26 
Различия между 2 и 3 - вероятно погрешности измерения. Увеличьте времена измерений на порядок-два (до десятков секунд), вот тогда погрешность станет намного менее измеряемой величины и можно будет о чём-то говорить.
1 вариант считается дольше потому что там не только $n$ умножений, а ещё и куча обрамляющего кода, который не оптимизировался при компиляции, которой не было, а обрабатывается каждый раз заново, вот он и тормозит. Да ещё наверняка и выделение памяти под всё увеличивающуюся переменную постоянно вмешивается, тоже весьма не быстрое.
Факториал не обязательно вычислять как произведение всех чисел, есть другие формулы и методы, ищите, это известная информация. Хотя бы в вики посмотрите про формулу Стирлинга и разложение по простым числам.

 
 
 
 Re: Скорость вычислений в Mathematica
Сообщение03.09.2018, 17:20 
Ещё не надо забывать, что вычисление одной штуки может повлиять на скорость вычисления другой штуки после, потому что там что-то может кэшироваться и т. п..

 
 
 
 Re: Скорость вычислений в Mathematica
Сообщение03.09.2018, 17:41 
arseniiv
На временах порядка долей секунды и более (т.е. заметно больше тика переключений задач) это уже не влияет т.к. размеры кэшей маленькие и нужная инфа будет быстро вытеснена из них после переключения задач, фоновых процессов обычно довольно много выполняется. Это первая причина. Вторая: время заполнения кэша пренебрежимо мало (меньше процента) по сравнению с длительностью тика переключения задач, потому вытеснено (при переключении задач, не при самом вычислении!) или сохранилось - на общее время почти не влияет, уж точно меньше погрешностей измерения времени и других факторов.
Разумеется подразумеваю что на диск инфа не свопится и остаётся хотя бы в ОЗУ, иначе всё совсем грустно и сравнивать скорости вычислений бесполезно.

 
 
 
 Re: Скорость вычислений в Mathematica
Сообщение03.09.2018, 18:27 
Dmitriy40
Я не про кэш процессора. :-) Внутреннее устройство Mathematica (и других СКА наверняка) довольно хитрое (хотя я знаю только намёки).

 
 
 
 Re: Скорость вычислений в Mathematica
Сообщение03.09.2018, 20:06 
Это легко проверить: сравнить времена сразу после запуска СКА и при повторе вычислений. Или сразу после запуска и после вычисления по другому алгоритму. Думаю все времена совпадут с точностью до погрешностей.

 
 
 
 Re: Скорость вычислений в Mathematica
Сообщение07.09.2018, 20:20 
Кстати, некоторые запрограммированные алгоритмы в Mathematica при первом запуске выполняются медленно, но при последующем выполнении выполняются быстрее. Mathematica запоминает все промежуточные вычисления?
Как отключить это, чтобы можно было более точно узнать время выполнения алгоритма?

 
 
 [ Сообщений: 7 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group