кодирование на языке maxima vs lisp

Я просто подумал написать какую-нибудь функцию, похожую на функции разделения Mathematica с передачей опции в максимумах в виде,

listpartitionpad(l,n,k,d):= block([temp:[],gap,newl,ntemp:[]],
                    newl:apply(create_listpad,flatten([n,k,d,l])),
                    map(lambda([x],if(length(newl)>=x+n-1 and is(unique[x]#[d]))then temp:cons(part(newl,makelist(i,i,x,x+n-1)),temp) 
                    else temp:cons(part(newl,makelist(s,s,x,length(newl))),temp)),makelist(i,i,1,length(newl),k)),
                    ntemp:sublist(temp,lambda([x],is(length(x)=n))),reverse(ntemp));

Usage: listpartitionpad([a,b,c,d,e,f,g],3,3,x); => [[a,b,c],[d,e,f],[g,x,x]]

Теперь, как я проверял, все функции манипулирования списками закодированы на lisp.

Мой вопрос в том, хорошо ли, что я могу кодировать любую такую ​​функцию на языке maxima, а не на lisp, или это вызовет у меня некоторые проблемы с производительностью или что-то еще, чего я должен знать, чего я еще не знаю. Я провел простой тест

:lisp(time(loop repeat 1000000))

real time       :      0.850 secs
run-gbc time    :      0.540 secs
child run time  :      0.000 secs
gbc time        :      0.310 secs

В случае другого подхода, основанного на максимумах,

block([],for i:1 thru 1000000 do []);

Оценка заняла 5,7700 секунд (прошло 5,7700 секунд).

И эта разница растет экспоненциально по мере роста i.

Является ли это причиной того, что все манипуляции со списками закодированы в lisp?


person Sejwal    schedule 12.03.2014    source источник


Ответы (2)


Несколько разных моментов.

  • Maxima в основном реализована на Лиспе, потому что (1) реализация требует доступа к внутренней структуре выражений и (2) обычно код Лиспа быстрее, чем код Максима.
  • Хотя это правда, что код Lisp обычно работает намного быстрее, чем код Maxima, я советую использовать Maxima для реализации алгоритмов, если только вы не очень хорошо знакомы с Lisp. Разница в скорости, вероятно, не будет иметь большого практического значения. Время, которое вы тратите как разработчик, важнее.
  • Что касается block([],for i:1 thru 1000000 do []), если время его выполнения действительно нелинейно по количеству циклов, это звучит как ошибка. Если вы можете это проверить, не стесняйтесь открыть отчет об ошибке. http://sourceforge.net/p/maxima/bugs (необходимо создать логин SF отправить отчет об ошибке.)
person Robert Dodier    schedule 12.03.2014
comment
Я составил список точек и нашел их линейными. Поэтому я думаю, что ожидаю слишком многого от системы, она работает нормально. На самом деле Mathematica делает это на 100 миллионов за 3 секунды. Вот почему я спросил. - person Sejwal; 13.03.2014
comment
@Rorschach Хорошо, спасибо за расследование. Кстати, в Maxima можно скомпилировать функции, которые могут их ускорить (немного или сильно, сильно разнится). Например. f() := block(...) (материал выше), а затем compile(f). - person Robert Dodier; 13.03.2014
comment
Я проверил это, и это сократило время почти в 17 раз. Это действительно круто. Теоретически читал, но еще не пробовал. Сейчас на 100 миллионов это почти 15 секунд, хотя раньше это казалось бесконечностью. - person Sejwal; 14.03.2014

Я не думаю, что язык реализации может объяснить экспоненциальный рост (который, вероятно, скорее квадратичен, чем экспоненциален).

Я подозреваю, что ваш алгоритм неоптимален.

person sds    schedule 12.03.2014
comment
хорошо, я могу согласиться в случае большего кода, но с самым коротким фрагментом это должно быть своего рода доказательством концепции. - person Sejwal; 12.03.2014
comment
доказательство концепции или нет, если ваш алгоритм квадратичен, вы проиграете независимо от того, какой язык. - person sds; 12.03.2014
comment
на самом деле это просто цикл for, и существует значительный временной разрыв. Роберт правильно объяснил. Спасибо за ваше мнение. :) - person Sejwal; 12.03.2014