以maxima语言编写与lisp编码

时间:2014-03-12 10:54:26

标签: lisp maxima computer-algebra-systems

我只是想写一些类似于Mathematica' s partition function的函数,并在maxima中传递选项,

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中编码的原因吗?

2 个答案:

答案 0 :(得分:3)

几点不同。

  • Maxima主要在Lisp中实现,因为(1)实现需要访问表达式的内部结构,(2)通常Lisp代码比Maxima代码更快。
  • 虽然Lisp代码的运行速度通常比Maxima代码快得多,但我的建议是使用Maxima实现算法,除非您非常熟悉Lisp。速度差异可能不会产生太大的实际差异。作为开发人员,您花费的时间更重要。
  • 关于block([],for i:1 thru 1000000 do []),如果它的运行时间在循环计数中确实是非线性的,那听起来就像一个bug。如果您可以验证,请随时打开有关它的错误报告。 http://sourceforge.net/p/maxima/bugs(您需要创建SF登录以提交错误报告。)

答案 1 :(得分:0)

我不认为实施的语言可以解释指数增长(实际上可能是二次而非指数)。

我怀疑你的算法不是最理想的。