2017-02-12 161 views
-1

我想減少下面的代碼的運行時間。有人可以提供任何提示我如何做到這一點?減少此功能的運行時間?

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循環需要最長的時間 –

回答

0

首先,如果你想提高你的代碼的速度,你需要知道爲什麼/哪裏東西是緩慢的。所以你需要措施。我會建議使用線剖析器。

但是通常最好的改進方法是以不同的方式做事。 您應該看看如何使用numpy數組獲取數據。 這會使代碼更簡單,並將循環從Python移動到用C編寫的numpy擴展。

+0

有人告訴我,使用聽寫會比運行數組快嗎?這不正確嗎? –

+0

@SaurabhMahajan:爲什麼字典會更快?通常字典也需要一些邏輯來執行查找。 –

+0

@WillemVanOnsem我會試試看看我得到的差異有多大 –