如何优化大数

时间:2015-08-13 08:44:59

标签: python numpy

我注意到当我做这个循环时我的程序太慢了,事实是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秒钟。有没有办法让它更快?

1 个答案:

答案 0 :(得分:0)

查看代码时,外部for循环运行N次,内部while循环仅运行所有N个元素一次。我认为,这使得总体复杂度为O(2n),即O(n)

主要成本可能是转换为numpy浮点数,其中一些可以在for循环之外拉出。

根据提供的内容,我建议进行以下更改:

  1. 在for循环之外进行转换

    converted_N = np.float64(N)
    for iang in xrange(0, N):
          z = np.float64(iang+1)/converted_N
    
  2. 预先形成一次索引计算并递增它而不是每次计算它

    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])
    
  3. 您还可以通过在while循环外移动idx*5来进一步减少此操作。

    这将减少乘法次数,但这些可以被认为是恒定时间。

    如果没有关于scum的任何其他信息,则无法运行比较基准。