मैं एक ऐसा फ़ंक्शन लिखने की कोशिश कर रहा हूं जो किसी सरणी पर गणितीय ऑपरेशन करता है और परिणाम देता है। एक सरल उदाहरण हो सकता है:जगह में numpy फ़ंक्शन आउटपुट सरणी को बदलना
def original_func(A):
return A[1:] + A[:-1]
गति-अप के लिए और प्रत्येक समारोह कॉल के लिए एक नया उत्पादन सरणी का आवंटन से बचने के लिए, मैं एक तर्क के रूप उत्पादन सरणी है, और जगह में यह परिवर्तन करने के लिए करना चाहते हैं:
def inplace_func(A, out):
out[:] = A[1:] + A[:-1]
हालांकि, जब निम्नलिखित तरीके से इन दोनों कार्यों बुला,
A = numpy.random.rand(1000,1000)
out = numpy.empty((999,1000))
C = original_func(A)
inplace_func(A, out)
मूल कार्य हो रहा है दोगुनी गति से इन-प्लेस फ़ंक्शन के रूप में। इसे कैसे समझाया जा सकता है? क्या इन-प्लेस फ़ंक्शन तेज नहीं होना चाहिए क्योंकि इसे स्मृति आवंटित करने की आवश्यकता नहीं है?
एक समाधान के रूप में: मुझे लगता है * यदि आप छोरों अपने आप को ऐसा करने के लिए ओलिवियर के जवाब में वर्णित मध्यवर्ती सरणियों से बचने के लिए होगा *। या शायद http://code.google.com/p/numexpr/ जैसी कुछ आपकी मदद कर सकती है? यह [प्रश्न] (http://stackoverflow.com/questions/2937669/linear-combinations-in-python-numpy) भी प्रासंगिक दिखता है। – gspr
मुझे लगता है कि आप इसे करके इंटरमीडिएट सरणी से बच सकते हैं: 'बाहर [:] = ए [1:]; बाहर + = ए [: - 1] 'बेशक आपका वास्तविक अहंकार शायद सुव्यवस्थित होने के लिए कठिन होगा। बेशक हर कीमत पर लूप से बचने की कोशिश करें। अक्सर रचनात्मक चीजें होती हैं जो आप जमा और ufuncs के साथ कर सकते हैं .. – Paul