wolfram-mathematica - 如何提高这段代码的性能?

标签 wolfram-mathematica julia

我正在尝试学习一些 Julia,在阅读了几个小时的手册后,我编写了以下代码:

ie = 200;
ez = zeros(ie + 1);
hy = zeros(ie);

fdtd1d (steps)=
    for n in 1:steps
        for i in 2:ie
            ez[i]+= (hy[i] - hy[i-1])
        end
        ez[1]= sin(n/10)
        for i in 1:ie
            hy[i]+= (ez[i+1]- ez[i])
        end
    end

@time fdtd1d(10000);

 elapsed time: 2.283153795 seconds (239659044 bytes allocated)


我相信它正在优化中,因为它比相应的 Mathematica 版本慢得多:
ie = 200;
ez = ConstantArray[0., {ie + 1}];
hy = ConstantArray[0., {ie}];

fdtd1d = Compile[{{steps}}, 
   Module[{ie = ie, ez = ez, hy = hy}, 
    Do[ez[[2 ;; ie]] += (hy[[2 ;; ie]] - hy[[1 ;; ie - 1]]);
     ez[[1]] = Sin[n/10];
     hy[[1 ;; ie]] += (ez[[2 ;; ie + 1]] - ez[[1 ;; ie]]), {n, 
      steps}]; Sow@ez; Sow@hy]];

result = fdtd1d[10000]; // AbsoluteTiming

{0.1280000, Null}


那么,如何制作 fdtd1d 的 Julia 版本快点?

最佳答案

两件事情:

第一次运行该函数时,时间将包括代码的编译时间。如果您想对 Mathematica 中的已编译函数进行苹果与苹果的比较,您应该运行该函数两次,并在第二次运行时计时。用你的代码我得到:

elapsed time: 1.156531976 seconds (447764964 bytes allocated)

对于第一次运行,包括编译时间和
elapsed time: 1.135681299 seconds (447520048 bytes allocated)

不需要编译时的第二次运行。

第二件事,可以说是更大的事情,是你应该避免在性能关键代码中使用全局变量。这是the performance tips section of the manual中的第一个提示.

这是使用局部变量的相同代码:
function fdtd1d_local(steps, ie = 200)
    ez = zeros(ie + 1);
    hy = zeros(ie);
    for n in 1:steps
        for i in 2:ie
            ez[i]+= (hy[i] - hy[i-1])
        end
        ez[1]= sin(n/10)
        for i in 1:ie
            hy[i]+= (ez[i+1]- ez[i])
        end
    end
    return (ez, hy)
end

fdtd1d_local(10000)
@time fdtd1d_local(10000);

在我的机器上比较你的 Mathematica 代码给出
{0.094005, Null} 

而结果来自 @timefdtd1d_local是:
elapsed time: 0.015188926 seconds (4176 bytes allocated)

或者大约快 6 倍。全局变量有很大的不同。

关于wolfram-mathematica - 如何提高这段代码的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23193677/

相关文章:

wolfram-mathematica - 柱内自毁按钮

wolfram-mathematica - 显示具有指定有效数字位数的数字

string - Julia - 为什么使用宏 @info 会产生糟糕的 @code_warntype 性能?

performance - 我怎样才能提高我的 Julia 程序的性能以获得出色的数字?

matrix - Mathematica 减去缺失值的矩阵

image-processing - 如何在 Mathematica 中生成这样的图像

performance - 有效地从单位范围中删除元素 (Julia)

通过引用调用从 Julia 调用 C 函数的正确方法?

julia - 在 Julia 中使用 SymPy 解决一般均衡问题

list - 将值 append 到导出的 .dat 的最快方法