作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在模拟 Ising Model使用简单的编码结构来处理尺寸大于 3 的铁磁体,但在效率方面存在一些问题。在我的代码中,有一个特定的函数是瓶颈。
在模拟过程中,需要找到所谓的给定站点的最近邻居。例如,在 2D Ising 模型中,自旋占据每个点的晶格,用两个数字表示:(x,y)。 (x,y)处的点的最近邻就是四个相邻的值,即(x+1,y),(x-1,y),(x,y+1),(x,y-1) .在 5D 中,某些格点的自旋具有坐标 (a,b,c,d,e) 和 10 个最近的邻居,形式与以前相同,但元组中的每个点。
现在这是给出以下输入的代码:
"site_i is a random value between 0 and n-1 denoting the site of the ith spin"
"coord is an array of size (n**dim,dim) that contains the coordinates of ever spin"
"spins is an array of shape (n**dim,1) that contains the spin values (-1 or 1)"
"n is the lattice size and dim is the dimensionality"
"neighbor_coupling is the number that tells the function to return the neighbor spins that are one spacing away, two spacing away, etc."
def calc_neighbors(site_i,coord,spins,n,dim,neighbor_coupling):
# Extract all nearest neighbors
# Obtain the coordinates of each nearest neighbor
# How many neighbors to extract
num_NN = 2*dim
# Store the results in a result array
result_coord = np.zeros((num_NN,dim))
result_spins = np.zeros((num_NN,1))
# Get the coordinates of the ith site
site_coord = coord[site_i]
# Run through the + and - for each scalar value in the vector in site_coord
count = 0
for i in range(0,dim):
assert count <= num_NN, "Accessing more than nearest neighbors values."
site_coord_i = site_coord[i]
plus = site_coord_i + neighbor_coupling
minus = site_coord_i - neighbor_coupling
# Implement periodic boundaries
if (plus > (n-1)): plus = plus - n
if (minus < 0): minus = n - np.abs(minus)
# Store the coordinates
result_coord[count] = site_coord
result_coord[count][i] = minus
# Store the spin value
spin_index = np.where(np.all(result_coord[count]==coord,axis=1))[0][0]
result_spins[count] = spins[spin_index]
count = count + 1
# Store the coordinates
result_coord[count] = site_coord
result_coord[count][i] = plus
# Store the spin value
spin_index = np.where(np.all(result_coord[count]==coord,axis=1))[0][0]
result_spins[count] = spins[spin_index]
count = count + 1
我真的不知道如何才能让它更快,但它会有很大帮助。也许是一种不同的存储方式?
最佳答案
不是答案,只是一些纠正的建议:当您尝试记录计算的每一步时,会进行大量复制。在不牺牲这一点的情况下,您可以删除 site_coord_i
,然后
# New coords, implement periodic boundaries
plus = (site_coord[i] + neighbor_coupling) % n
minus = (site_coord[i] - neighbor_coupling + n) % n
这避免了中间步骤(“如果...”)。另一个建议是推迟使用子数组,直到您真正需要它为止:
# Store the coordinates
rcc = site_coord
rcc[i] = plus
# Store the spin value
spin_index = np.where(np.all(rcc==coord,axis=1))[0][0]
result_spins[count] = spins[spin_index]
result_coord[count] = rcc
count += 1
目标是减少比较中使用的变量的维数,并优先使用局部变量。
关于python - 伊辛模型 : How to shorten simulation time?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29046564/
我是一名优秀的程序员,十分优秀!