निम्नलिखित समारोह पर विचार करें:अनावश्यक जूलिया अद्यतन ऑपरेटर्स का उपयोग कर आवंटन
x = rand(30,30,100000)
b = rand(100000)
@time mytest(x,b)
elapsed time: 0.571765222 seconds (727837732 bytes allocated, 66.49% gc time)
यह इतना स्मृति और खर्च इतना समय क्यों आवंटित किया गया है:
function mytest(x, b)
y = zeros(x[:,:,1])
for i in 1:length(b)
y += b[i] * x[:,:,i]
end
return y
end
जब मैंने इसे चलाने के लिए, मैं निम्नलिखित मिल कचरा संग्रह कर रहे हैं? कोड स्थिर प्रकार होना चाहिए, और मैं +=
ऑपरेटर को फिर से आवंटन करने की अपेक्षा करता हूं। हालांकि, ऐसा लगता है कि यह प्रत्येक बार दो मैट्रिक्स जोड़ता है फिर से आवंटित किया जाता है।
क्या मुझे यह जूलिया में एक बग माना जाना चाहिए? और सबसे महत्वपूर्ण बात यह है कि मैं इस कोड को ऐसे तरीके से कैसे लिख सकता हूं जो आवंटित नहीं होता है?
संपादित करें: निश्चित टाइपो।
दायां हाथ की ओर 'बी [i] * x [:,:, i]' पहले उत्पाद के परिणाम के साथ एक अस्थायी सरणी आवंटित करता है इससे पहले कि बाईं ओर स्थित जगह में जोड़ा जाता है। अस्थायी सरणी को तब कचरा इकट्ठा करने की जरूरत है। कम से कम ... इस तरह यह [टैग: numpy] के साथ काम करेगा। –
@moarningsun, टिप के लिए धन्यवाद। प्रदर्शन महत्वपूर्ण कोड के साथ मेरा पिछला अनुभव ज्यादातर सी ++ और ईजिन का उपयोग कर रहा है, जो एक टुकड़ा लेने पर अस्थायी आवंटित नहीं करेगा। मैंने लूप के लिए तीन नेस्टेड रखने के लिए अपना कोड बदल दिया है, और आवंटन समस्या ठीक कर दी गई है। (इससे पहले मैंने ArrayViews पैकेज का उपयोग करने की कोशिश की, लेकिन यह चीजों को ठीक करने के लिए प्रतीत नहीं होता था।) यदि कोई बेहतर तरीका है तो मैं अभी भी उत्सुक हूं। –
@JimGarrison: चर्चा [यहां] देखें (https://groups.google.com/forum/#!topic/julia-users/i5hfGpWRHlk)। '+ =' सिर्फ सिंटैक्टिक चीनी है (अब कम से कम) और इसलिए मुझे लगता है कि यह हमेशा फिर से आवंटित होता है (लेकिन अगर कोई गलत है तो कृपया मुझे सही करें)। साथ ही, मुझे यह देखने में दिलचस्पी होगी कि तीन लूप ने आपकी समस्या का समाधान कैसे किया। – cd98