我注意到当我做这个循环时我的程序太慢了,事实是N是一个很大的数字(1000000)。
start=time.time()
ipf = 0
idx = 2
for iang in xrange(0, N):
z = np.float64(iang+1)/np.float64(N)
while scum[ipf+1]<z:
ipf += 1
phase_H[idx*5*N+iang*5+0] = np.float32( phase.phase[ipf, 1])
phase_H[idx*5*N+iang*5+1] = np.float32( phase.phase[ipf, 0])
phase_H[idx*5*N+iang*5+2] = np.float32( phase.phase[ipf, 2])
phase_H[idx*5*N+iang*5+3] = np.float32(0)
print time.time() - start
此代码大约需要9秒钟。有没有办法让它更快?
答案 0 :(得分:0)
查看代码时,外部for
循环运行N次,内部while
循环仅运行所有N个元素一次。我认为,这使得总体复杂度为O(2n),即O(n)
主要成本可能是转换为numpy浮点数,其中一些可以在for循环之外拉出。
根据提供的内容,我建议进行以下更改:
在for循环之外进行转换
converted_N = np.float64(N)
for iang in xrange(0, N):
z = np.float64(iang+1)/converted_N
预先形成一次索引计算并递增它而不是每次计算它
base_index = idx*5*N+iang*5
phase_H[base_index] = np.float32( phase.phase[ipf, 1])
phase_H[base_index+1] = np.float32( phase.phase[ipf, 0])
phase_H[base_index+2] = np.float32( phase.phase[ipf, 2])
您还可以通过在while循环外移动idx*5
来进一步减少此操作。
这将减少乘法次数,但这些可以被认为是恒定时间。
如果没有关于scum
的任何其他信息,则无法运行比较基准。