मेरे पास अभी कुछ कोड है जो ठीक काम करता है, लेकिन यह पूरी तरह से बहुत धीमा है। मैं पांडस डेटाफ्रेम में प्रत्येक पंक्ति के लिए वर्गों का भारित योग जोड़ने की कोशिश कर रहा हूं। मैं संचालन को वेक्टराइज करना चाहता हूं - ऐसा लगता है कि यह बहुत तेज है - लेकिन कोड में एक शिकन है जिसने वेक्टर करने के मेरे प्रयासों को हराया है।

totalDist = 0.0
    
for index, row in pU.iterrows():
    totalDist += (row['distance'][row['schoolChoice']]**2.0*float(row['students']))

पंक्ति में 'छात्र' (एक पूर्णांक), दूरी (लंबाई n की एक संख्यात्मक सरणी), और स्कूल चॉइस (एन -1 से कम या उसके बराबर एक पूर्णांक है जो कि गणना के लिए उपयोग की जा रही दूरी सरणी के किस तत्व को निर्दिष्ट करता है) . मूल रूप से, मैं numpy सरणी से एक पंक्ति-विशिष्ट मान खींच रहा हूं। मैंने df.lookup का उपयोग किया है, लेकिन यह वास्तव में धीमा लगता है और इसे बहिष्कृत किया जा रहा है। इसे तेजी से चलाने के बारे में कोई सुझाव? अग्रिम में धन्यवाद!

2
Jon Huntley 22 मार्च 2021, 08:56
1
क्या प्रत्येक पंक्ति के लिए distance समान लंबाई है?
 – 
Karl Thornton
22 मार्च 2021, 11:18

1 उत्तर

सबसे बढ़िया उत्तर

यदि अन्य सभी विफल हो जाते हैं तो आप प्रत्येक पंक्ति पर .apply() का उपयोग कर सकते हैं

totalSum = df.apply(lambda row: row.distance[row.schoolChoice] ** 2 * row.students, axis=1).sum()

तेज़ी से आगे बढ़ने के लिए आप numpy आयात कर सकते हैं

totalSum = (numpy.stack(df.distance)[range(len(df.schoolChoice)), df.schoolChoice] ** 2 * df.students).sum()

सुन्न विधि के लिए प्रत्येक पंक्ति के लिए समान लंबाई की आवश्यकता होती है - हालाँकि यदि आवश्यक हो तो उन्हें समान लंबाई तक पैड करना संभव है। (हालांकि यह किए गए किसी भी लाभ को प्रभावित कर सकता है।)

जैसे १५०,००० पंक्तियों के df पर परीक्षण किया गया:

         distance  schoolChoice  students
0       [1, 2, 3]             0         4
1       [4, 5, 6]             2         5
2       [7, 8, 9]             2         6
3       [1, 2, 3]             0         4
4       [4, 5, 6]             2         5

समय:

         method    time
0      for loop   15.9s
1      df.apply    4.1s
2         numpy    0.7s
2
Karl Thornton 22 मार्च 2021, 21:45
धन्यवाद, मैं इसे थोड़ी देर में एक शॉट देने जा रहा हूँ! सुन्न सरणी का चयन काम करना चाहिए, लेकिन शायद किसी दिन numpy # 1 के साथ शुरू होगा, अगर मेरे पास 32 से अधिक है (जो एक अलग स्कूल जिला होगा!)
 – 
Jon Huntley
22 मार्च 2021, 16:42
हाँ, मैंने choose को संपादित कर दिया है - यह अन्य दृष्टिकोण से अधिक लाभ नहीं उठाता है।
 – 
Karl Thornton
22 मार्च 2021, 21:47