对于我的计算物理课,我们必须计算 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/