Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么访问numpy数组中的一个元素会让我的程序慢很多?_Python_Performance_Numpy - Fatal编程技术网

Python 为什么访问numpy数组中的一个元素会让我的程序慢很多?

Python 为什么访问numpy数组中的一个元素会让我的程序慢很多?,python,performance,numpy,Python,Performance,Numpy,我正在写一个模拟(2D伊辛模型模拟)。它需要在二维数组中拾取一个随机元素,然后将该值乘以-1。二维数组中的元素是自旋站点,其值为+1或-1 我忘了添加一行代码,这实际上改变了spin站点。添加这(一!)行代码会显著降低程序的速度。所有自旋站点都默认为-1 我尝试过编辑其他函数,这些函数会做一些基本的数学运算(计算自旋位置的总能量,基本上只是乘法和加法)来隐藏-1翻转,通过将一些加法改为减法来解释-1翻转,从而避免访问该数组元素。仍然疯狂地减慢速度 这是time命令的结果,不翻转随机数组元素 实0

我正在写一个模拟(2D伊辛模型模拟)。它需要在二维数组中拾取一个随机元素,然后将该值乘以-1。二维数组中的元素是自旋站点,其值为+1或-1

我忘了添加一行代码,这实际上改变了spin站点。添加这(一!)行代码会显著降低程序的速度。所有自旋站点都默认为-1

我尝试过编辑其他函数,这些函数会做一些基本的数学运算(计算自旋位置的总能量,基本上只是乘法和加法)来隐藏-1翻转,通过将一些加法改为减法来解释-1翻转,从而避免访问该数组元素。仍然疯狂地减慢速度

这是time命令的结果,不翻转随机数组元素

实0m1.425s 用户0m1.685s 系统0m1.078s

以及添加一行代码的结果(如下所示) 真正的0m26.615s 用户0m27.019s sys 0m0.920s

将numpy导入为np
将matplotlib.pyplot作为plt导入
#正如在讲座中所看到的:
#用Metropolis算法实现Ising模型
#基于Landau等人的IsingViz.py。
N=(20002000)#自旋位点数
num_steps=20*N[0]*N[1]#迭代次数
B=0.05#磁场
μ=0.33#gμ(如果B=0,则不需要)
J=1.#交换能量
k=1。
t=1。
np.random.seed()
state0=-1*np.one(N)#以任意自旋配置开始
Evals=[]
def能量(状态,J,mu,B):
#Energy将在状态中的每一行调用row_Energy,并在
#它的每一行转置。
总能量=0
对于处于状态的行:
总能量+=行能量(行,J,μ,B)
对于状态为.transpose()的列:
总能量+=行能量(col,J,mu,B)
返回总能量
def row_能量(S、J、mu、B):
第一个集合=np.concatenate([np.array([S[-1]]),S[:-1]])
FirstTerm=np.sum(-J*第一个集合[:-1]*第一个集合[1:])
第二项=np.和(-mu*S*B)
回报(第一学期+第二学期)
def能量变化(S、coor):
“”“如果自旋'i'翻转,确定能量的变化
`(i+1)%len(S)`实现周期性边界条件。
"""
x=coor[0]
y=coor[1]
#将自旋位置乘以所有相邻元素
左S_=S[x-1,y]
S_right=S[(x+1)%len(S),y]
S_up=S[x,(y+1)%len(S)]
S_down=S[x,y-1]
返回2*J*S[x,y]*(S_左+S_右+S_上+S_下%len(S))+2*B*mu*S[x,y]
def TwoDIsing(state0,num_步骤,J,mu,B,kT):
ES=能量(状态0,J,μ,B)
能量_值=[]
能量值。附加(ES)
#包含状态配置的副本,因此我们不必存储
#2**N**2*#个时间步长元素
state\u configs=np.array([state0,state0])
deltas=[]#一种跟踪状态变化的简便方法。
rands=np.random.randint(2000,大小=(num_步数,2))
计数=1
对于x,y,以rands表示:
#测试状态=状态配置[-1]
#试验步骤:在一个随机位置翻转旋转
#测试状态[x,y]*=-1。
状态配置[1][x][y]*=-1
ET=ES+能量变化(状态配置[-1],(x,y))
如果np.exp((ES-ET)/(kT))>np.random.random():
#状态配置[-1]=测试状态#替换状态,或
ES=ET
delta.append((x,y))
其他:
#向前推进前一状态
状态配置[-1]=状态配置[-2]
delta.append(())
能量值。附加(ES)
计数+=1
如果计数%1000==0:打印((计数/数量步数)*100,%……)
返回状态配置、能量值、增量

使用state\u configs存储状态的两个副本时出错。不这样做要快得多。阅读评论了解详情

def TwoDIsing(state0,num_步骤,J,mu,B,kT):
ES=能量(状态0,J,μ,B)
能量_值=[]
能量值。附加(ES)
#包含状态配置的副本,因此我们不必存储
#2**N**2*#个时间步长元素
#state\u configs=np.array([state0,state0])
deltas=[]#一种跟踪状态变化的简便方法。
rands=np.random.randint(2000,大小=(num_步数,2))
计数=1
对于x,y,以rands表示:
#测试状态=状态配置[-1]
#试验步骤:在一个随机位置翻转旋转
#测试状态[x,y]*=-1。
状态0[x][y]*=-1
ET=ES+能量变化(状态0,(x,y))
如果np.exp((ES-ET)/(kT))>np.random.random():
#状态配置[-1]=测试状态#替换状态,或
ES=ET
delta.append((x,y))
其他:
#向前推进前一状态
状态0[x,y]*=-1
delta.append(())
能量值。附加(ES)
计数+=1
如果计数%1000==0:打印((计数/数量步数)*100,%……)
返回状态配置、能量值、增量

使用state\u configs存储状态的两个副本时出错。不这样做要快得多。阅读评论了解详情

def TwoDIsing(state0,num_步骤,J,mu,B,kT):
ES=能量(状态0,J,μ,B)
能量_值=[]
能量值。附加(ES)
#包含状态配置的副本,因此我们不必存储
#2**N**2*#个时间步长元素
#state\u configs=np.array([state0,state0])
deltas=[]#一种跟踪状态变化的简便方法。
rands=np.random.randint(2000,大小=(num_步数,2))
计数=1
对于x,y,以rands表示:
#测试状态=状态配置[-1]
#试验步骤:在一个随机位置翻转旋转
#测试状态[x,y]*=-1。
状态0[x][y]*=-1
ET=ES+能量变化(状态0,(x,y))
如果np.exp((ES-ET)/(kT))>np。