对于一个小型项目,我用Python/Numpy编写了一个2D Ising-/Potts模型montecarlo模拟,下面是(简化的)代码。
基本上,该代码执行以下操作:
index = (a*i + rand) % (N**2)
x = index % N
y = index // N
)我试图尽我所能加快它的速度,但是对于大型数组(N,M>;500),代码并不是很快。因为我需要大约10e5 MCS的阵列才能看到明显的趋势,实现了
1 loop, best of 3: 276 ms per loop
对于100x100阵列上的1个MCS来说,这还不够。不幸的是,由于缺乏经验,我不知道如何提高性能。
我假设Neighbors()和calc_dE()函数是瓶颈,尤其是嵌套循环,但我找不到加快速度的方法。我的cython尝试并不是很成功,因为我以前从未对cython做过任何事情,所以我愿意接受任何建议。
代码:
(pyplot命令仅用于可视化,通常会添加注释。)
^{pr2}$
不确定在依赖关系方面是否有任何限制,但我肯定会研究Numba。它提供了一组修饰符(
njit
),如果您使用兼容的类型(例如numpy数组,而不是pandas数据帧),可以将代码编译为机器代码,并使其速度更快。在另外,不知道你在看什么样的规模,但我相信你可以找到比手动实现for循环更好的优化素数搜索算法的例子。在
否则,您总是可以依靠Cython,但这需要重新编写代码。在
编辑:好的,我用numba试一试。在
一些注意事项:
njit
来修饰它Neighbors
中,我不得不将rows
和{list
改为{np.random.random_integers
替换为np.random.randint
,因为前者已被弃用math.exp
替换为np.exp
,这将稍微提高性能(除了节省导入)运行相同的例子
^{pr2}$通过
%timeit fun(L, MCS, a)
(在Jupyter)给了我比你现在的速度快15倍。可能还有更多的优化可以做,numba的好处是我在没有深入研究或显著改变代码实现方式的情况下获得了x15的加速。在
一些一般性的观察:
Neighbors
中,参数/参数n
没有使用,因此为了清晰起见,应该删除它(或更新代码)largest_primes_under
只被调用一次的评论绝对是正确的,我应该更仔细地看一下代码。在相关问题 更多 >
编程相关推荐