【发布时间】:2018-11-02 19:50:50
【问题描述】:
我为数值模拟编写了以下简单代码。我的编程水平是初学者。
import numpy as np
import time as t
start = t.time()
r=10**-8
alpha=60*(np.pi/180)
gamma_sa=58.6*10**-3
gamma_sw=25*10**-3
gamma_pa=153*10**-3
gamma_pw=110*10**-3
gamma_aw=72.5*10**-3
kt= 1.38*10**-23*293
i=0
##############variables########################
omega=0
zeta= (3/2 )*np.pi*r**3 *10**-3
dt=0.01
std=np.sqrt(2*kt*zeta*dt)
for k in range(1,2):
beta_i=[]
j_i=[]
B=[]
time=np.arange(dt,10,dt)
Fs_i=[]
dE_i=[]
j=0
for i in range (len(time)):
j_i.append(j)
beta=(90-j)
beta1=(90-j)*(np.pi/180)
Fs=0
Ft = (np.random.randn()*std*np.sqrt(dt))/zeta
beta_i.append(beta)
del(beta)
j=(j+Ft+Fs)%360
MSD=[]
diff_i=[]
tau_i=[]
for l in range(1,len(time)):
tau=l*dt
tau_i.append(tau)
del(tau)
for i in range(1,(len(time)-l)):
diff=(j_i[l+i]-j_i[i])**2*dt
diff_i.append(diff)
MSD_j=np.sum(diff_i)/np.max(time)
MSD.append(MSD_j)
del(MSD_j)
np.savetxt("MSD_no_fs%d"%k, MSD)
np.savetxt("Tau_no_fs%d"%k,tau_i)
print(t.time() - start)
代码运行成功,执行时间约为 38 秒。但是,如果我将 dt 从.01 增加到 .001,它似乎需要无限的时间,因为脚本会继续运行而不会出现错误。有人可以解释关于 dt、k 范围和时间范围的执行时间依赖性以及任何有效的方法吗?因为我想选择 dt=.0001,krange (0,100,dt) 和时间 (dt,100,dt)。这方面的最佳做法是什么?
PS:8 GB 内存和 3.31 GHz v6 处理器。
【问题讨论】:
-
执行时间似乎与
time数组的长度成二次方关系,因为有两个for循环。因此,如果您将长度乘以 10(当您将步长减小 10 倍时,您实际上是在做什么),那么执行时间将增加 100 倍,即 3800 秒。
标签: python numpy nested-loops