我正在做一個Python中氬氣液體的分子動力學模擬。我有一個穩定的版本運行,但它運行緩慢超過100個原子。我將瓶頸標識爲以下嵌套for循環。這是一個力計算投入是從我的main.py腳本調用函數中:改善嵌套循環性能
def computeForce(currentPositions):
potentialEnergy = 0
force = zeros((NUMBER_PARTICLES,3))
for iParticle in range(0,NUMBER_PARTICLES-1):
for jParticle in range(iParticle + 1, NUMBER_PARTICLES):
distance = currentPositions[iParticle] - currentPositions[jParticle]
distance = distance - BOX_LENGTH * (distance/BOX_LENGTH).round()
#note: this is so much faster than scipy.dot()
distanceSquared = distance[0]*distance[0] + distance[1]*distance[1] + distance[2]*distance[2]
if distanceSquared < CUT_OFF_RADIUS_SQUARED:
r2i = 1./distanceSquared
r6i = r2i*r2i*r2i
lennardJones = 48. * r2i * r6i * (r6i - 0.5)
force[iParticle] += lennardJones*distance
force[jParticle] -= lennardJones*distance
potentialEnergy += 4.* r6i * (r6i - 1.) - CUT_OFF_ENERGY
return(force,potentialEnergy)
大寫字母的變量是不變的,在config.py文件中定義。 「currentPositions」是一個3乘以顆粒數矩陣。
我已經使用scipy.weave實現了嵌套for循環版本,該版本受此網站的啓發:http://www.scipy.org/PerformancePython。
但是,我不喜歡靈活性的喪失。我對「向量化」這個循環感興趣。我真的不明白這是如何工作的。任何人都可以給我一個線索或一個教這個教程的好教程嗎?
看看本教程由pyconeuro http://www.google.com/url?sa=t&rct=j&q=high%20performance%20python%20pdf&source=web&cd=1&cad=rja&ved=0CC8QFjAA&url=http% 3A%2F%2Fjohnstachurski.net%2Fpersonal%2F_downloads%2FHighPerformancePython.pdf&EI = -Z8bUbKgFoTU0gGtyIHIDw&USG = AFQjCNF4ZbcYEuyxO_hrPLXfnkN91jB6Bg&BVM = bv.42261806,d.cWE。將向您展示如何進行矢量化或者您可以使用cython .. – locojay 2013-02-13 14:16:15
使用編譯語言編寫computeForce函數,或者按照建議使用cython。對於上面的嵌套循環,Python絕對是不理想的。 – 2013-02-13 14:26:41
真棒。謝謝! – seb 2013-02-13 14:36:26