विश्वविद्यालय में एक अभ्यास के लिए, हमें पाइथन में सटीक न्यूटनियन बलों के साथ Leapfrog integrator लागू करना पड़ा। पाठ्यक्रम खत्म हो गया है और हमारे समाधान काफी अच्छे थे, लेकिन मुझे आश्चर्य हुआ कि अगर कोई बल गणना के प्रदर्शन में और भी सुधार कर सकता है।न्यूप्टीयन बलों की अधिकांश प्रदर्शन गणना numpy/scipy
टोंटी (त्वरण उर्फ) सभी बलों की गणना करने के लिए है:
एक बड़े के लिए(1000 और बड़ा) कणों एन (i, j < एन) की संख्या।
यहाँ r और आर कणों की स्थिति आकार की एक ndarray में संग्रहीत की 3 आयामी वैक्टर हैं (एन, 3) और ग्राम कण द्रव्यमान बार गुरुत्वाकर्षण स्थिरांक जो मैं बचाया है आकार (एन) के एक अंडाकार में।
def a(self):
sep = self.r[np.newaxis, :] - self.r[:, np.newaxis]
# Calculate the distances between all particles with cdist
# this is much faster than by hand
dists = cdist(self.r, self.r)
scale =dists*dists*dists
# set diagonal elements of dist to something != 0, to avoid division by 0
np.fill_diagonal(scale,1)
Fsum = (sep/scale.reshape(self.particlenr,self.particlenr,1))*self.Gm[:,None]
return np.add.reduce(Fsum,axis=1)
यह कीड़े मुझे कि यह शायद सबसे तेजी से संस्करण नहीं है लेकिन:
सबसे तेजी से संस्करण मैं अब तक पाया निम्नलिखित है। सीडीआईटी की तुलना करते समय पहली पंक्ति बहुत धीमी प्रतीत होती है जो अनिवार्य रूप से वही गणना कर रही है। साथ ही, यह समाधान समस्या में आर और आर स्विचिंग की समरूपता का उपयोग नहीं करता है और सभी तत्वों की गणना दो बार करता है।
क्या आप कोई प्रदर्शन सुधार जानते हैं (कुछ अनुमान के लिए बल-गणना को बदलने या प्रोग्रामिंग भाषा को बदलने के बिना)?