python - 如何加速马德隆常数的三维求和?

标签 python performance numpy vectorization

对于我的计算物理课,我们必须计算 Madelung Constant对于氯化钠。我执行此操作的代码使用三个嵌套的 for 循环,因此运行速度非常慢。我想知道是否有办法使用数组或其他方法来提高计算速度。谢谢

from math import sqrt 
l= int(input("The lattice size is :"))
M = 0.0
for i in range(-L,L+1):
    for j in range(-L,L+1):
       for k in range(-L,L+1):
           if not (i==j==k==0):
              M += ((-1)**(i+j+k+1))/sqrt(i*i +j*j +k*k)

print("The Madelung constant for NaCl with lattice size",l,"is",M)

最佳答案

既然您在评论中指出您可以使用numpy,我建议您这样做。您可以为整数构建 3d 网格,并同时计算每一项,从而矢量化您的计算。您只需要注意每个整数均为 0 的奇异情况,例如使用 numpy.where :

import numpy as np

ran = np.arange(-L,L+1)
i,j,k = np.meshgrid(ran,ran,ran)
M = np.where((i!=0) | (j!=0) | (k!=0),
             (-1)**(i+j+k+1)/np.sqrt(i**2+j**2+k**2),
             0).sum()

ran 是一个 numpy 数组,其元素与 range() 中的元素相同(如果在 python 3 中转换为列表)。 meshgrid 然后构造三个 3d 数组,它们一起跨越您需要执行求和的 3d 空间。

请注意,对于大型域,此方法需要更高的内存。这在矢量化中很常见:您可以以增加内存需求为代价来节省 CPU 时间。

关于python - 如何加速马德隆常数的三维求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39777534/

相关文章:

python - 在 python 中使用 org.mpris.mediaplayer2.player PlaybackStatus 属性

javascript - 高效的 Javascript 字符串替换

java - 查询数据库什么效率更高

python - 识别数组中的数字组(图像的组像素)

python - 生成二维数组的梯度图

python - 为 numpy、scipy 和 matplotlib 的 intersphinx 链接指定目标

python - 在字符串列表中搜索另一个列表中的任何子字符串

python - F#编程语言中有类似Python函数装饰器的吗?

javascript - pypugjs 中的组合条件

mysql - 可以找到阿拉伯语拼写错误的 SQL 查询