减少此功能的运行时间?

问题描述:

我想减少下面的代码的运行时间。有人可以提供任何提示我如何做到这一点?减少此功能的运行时间?

def sample(BODIES, iterations): 
    dt = 0.01 
    TOTAL_BODIES = BODIES.keys() 
    for _ in range(iterations): 
     seenit = dict() 
     for body1 in TOTAL_BODIES: 
      ([x1, y1, z1], v1, m1) = BODIES[body1] 
      for body2 in TOTAL_BODIES: 
       if (body1 != body2) and not (body2 in seenit): 
        ([x2, y2, z2], v2, m2) = BODIES[body2] 
        (dx, dy, dz) = (x1 - x2, y1 - y2, z1 - z2) 
        tmp = dt * ((dx * dx + dy * dy + dz * dz) ** (-1.5)) 
        m2_tmp = m2 * tmp 
        m1_tmp = m1 * tmp 
        v1[0] -= dx * m2_tmp 
        v1[1] -= dy * m2_tmp 
        v1[2] -= dz * m2_tmp 
        v2[0] += dx * m1_tmp 
        v2[1] += dy * m1_tmp 
        v2[2] += dz * m1_tmp 
        seenit[body1] = True 

我运行的Python 3.5 100000次迭代,但机构的规模较小(4元)

编辑:这是最快的版本,我可以得到的。

def sample(BODIES, iterations, dt): 
    for _ in range(iterations): 
     for body1, body2 in combinations(BODIES, 2): 
      ([x1, y1, z1], v1, m1) = BODIES[body1] 
      ([x2, y2, z2], v2, m2) = BODIES[body2] 
      dx = x1-x2 
      dy = y1-y2 
      dz = z1-z2 
      tmp = dt * ((dx * dx + dy * dy + dz * dz) ** (-1.5)) 
      m2_tmp = m2 * tmp 
      m1_tmp = m1 * tmp 
      v1[0] -= dx * m2_tmp 
      v1[1] -= dy * m2_tmp 
      v1[2] -= dz * m2_tmp 
      v2[0] += dx * m1_tmp 
      v2[1] += dy * m1_tmp 
      v2[2] += dz * m1_tmp 
+1

要在这里获得答案的机会很多,您确实需要提供更多信息。这个函数做什么?它需要什么输入?它的输出是什么?你有没有分析功能,看看哪些部分花费最多时间? – Blckknght

+0

@Blckknght它运行大量(100,000)迭代并将字典作为输入。更新v1和v2的操作在每次迭代中最长约为0.15。 –

+1

我怀疑那些时间最长。这只是数学运算。你的嵌套for循环需要最长的时间 –

首先,如果你想提高你的代码的速度,你需要知道为什么/哪里东西是缓慢的。所以你需要措施。我会建议使用线剖析器。

但是通常最好的改进方法是以不同的方式做事。 您应该看看如何使用numpy数组获取数据。 这会使代码更简单,并将循环从Python移动到用C编写的numpy扩展。

+0

有人告诉我,使用听写会比运行数组快吗?这不正确吗? –

+0

@SaurabhMahajan:为什么字典会更快?通常字典也需要一些逻辑来执行查找。 –

+0

@WillemVanOnsem我会试试看看我得到的差异有多大 –