Julia 使用rand()改进性能

Julia 使用rand()改进性能,julia,montecarlo,Julia,Montecarlo,我正在对伊辛模型进行蒙特卡罗模拟。总的来说,代码相当高效。以下函数的调用次数约为1000万次: function stepFlip(sim::Ising) i = rand(1:sim.n) j = rand(1:sim.n) dE = dEnergy(i, j, sim) if dE < 0 || rand() < exp(-dE/sim.T) sim.spins[i,j] *= -1 end end 功能单步翻转(si

我正在对伊辛模型进行蒙特卡罗模拟。总的来说,代码相当高效。以下函数的调用次数约为1000万次:

function stepFlip(sim::Ising)
    i = rand(1:sim.n)
    j = rand(1:sim.n)

    dE = dEnergy(i, j, sim)

    if dE < 0 || rand() < exp(-dE/sim.T)
        sim.spins[i,j] *= -1
    end
end
功能单步翻转(sim::Ising)
i=兰特(1:sim.n)
j=兰特(1:sim.n)
dE=能量(i,j,sim)
如果dE<0 | | rand()

我有没有办法优化随机数生成,这是占用大部分执行时间的原因?我知道预生成所有内存并按我称之为stepFlip的方式读取它们可能会更快,但在这一点上,如果我的目标是性能,那么分配所有内存是否值得呢?

也许可以帮助您。此外,还有很多PRNG,有时性能差异很大——而Mersenne Twister(Julia中的默认设置)可能非常慢,IIRC。但是您应该测试它——可以找到几个实现。您确定
rand
s占用了大部分时间吗?你分析过模拟吗?在1000万左右,我猜
rand
s总共不到一秒钟。在我的(旧笔记本)电脑上,运行
rand(1:100)
两次乘以1000万,需要0.2秒。这真的是一个瓶颈吗?预生成它们可能不会更快,但会占用更多内存。中实现了用于julia的快速随机数生成器。如果兰德真的是你的瓶颈,那么这是你加速这一代人的唯一途径。Xoroshiro家族有一些很好的快速算法,但这完全取决于你的随机性/速度权衡。还有一个更快的
rand(a:b)
实现也许可以帮助你。此外,还有很多PRNG,有时性能差异很大——而Mersenne Twister(Julia中的默认设置)可能非常慢,IIRC。但是您应该测试它——可以找到几个实现。您确定
rand
s占用了大部分时间吗?你分析过模拟吗?在1000万左右,我猜
rand
s总共不到一秒钟。在我的(旧笔记本)电脑上,运行
rand(1:100)
两次乘以1000万,需要0.2秒。这真的是一个瓶颈吗?预生成它们可能不会更快,但会占用更多内存。中实现了用于julia的快速随机数生成器。如果兰德真的是你的瓶颈,那么这是你加速这一代人的唯一途径。Xoroshiro家族有一些很好的快速算法,但这完全取决于您的随机性/速度权衡。在