【问题标题】:coding in maxima language vs lisp用 maxima 语言编码 vs lisp
【发布时间】:2014-03-12 10:54:26
【问题描述】:

我只是想写一些类似于Mathematicapartition function的函数,并在maxima as中传递选项,

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

【问题讨论】:

    标签: lisp maxima computer-algebra-systems


    【解决方案1】:

    几个不同的点。

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

    【讨论】:

    • 我绘制了点列表,我发现它们是线性的。所以我认为我对系统的期望太高了,它似乎工作正常。实际上,Mathematica 在 3 秒内完成了 1 亿次。这就是我询问的原因。
    • @Rorschach 好的,感谢您的调查。顺便说一句,您可以在 Maxima 中编译可以加快它们的函数(一点点或很多,它变化很大)。例如。 f() := block(...)(上面的东西)然后是compile(f)
    • 是的,我检查了它,它几乎将时间缩短了 17 倍。这太酷了。我从理论上读过它,但还没有尝试过。现在对于 1 亿,它几乎是 15 秒,虽然早些时候它似乎是无限的。
    【解决方案2】:

    我认为实现语言无法解释指数级增长(实际上可能是二次方而非指数级)。

    我怀疑你的算法不是最优的。

    【讨论】:

    • 好吧,如果代码较大,我可以同意,但对于最短的 sn-p,它必须是一种概念证明。
    • 概念证明与否,如果你的算法是二次的,那么无论什么语言你都会输。
    • 实际上它只是一个for循环运行,并且有相当大的时间间隔。罗伯特正确地解释了它。感谢您的意见。 :)
    猜你喜欢
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 2022-06-14
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多