में एक सरणी को अनुक्रमणित करते समय स्मृति आवंटन से बचें प्रश्न: मैं स्मृति आवंटन को ट्रिगर किए बिना एक सरणी में अनुक्रमित करना चाहता हूं, खासकर जब किसी फ़ंक्शन में अनुक्रमित तत्वों को पारित करना। जूलिया डॉक्स पढ़ने से, मुझे लगता है इस सवाल का जवाब sub
समारोह का उपयोग कर के आसपास घूमती है, लेकिन काफी कैसे नहीं देख सकता ...जूलिया
कार्य उदाहरण: मैं Float64
(x
) की एक बड़ी वेक्टर और उसके बाद एक सूचकांक का निर्माण x
में प्रत्येक अवलोकन के लिए।
N = 10000000
x = randn(N)
inds = [1:N]
अब मैं समय x
और x[inds]
से अधिक mean
समारोह (मैं mean(randn(2))
पहले समय में किसी भी संकलक अनियमितताओं से बचने के लिए चलाने):
@time mean(x)
@time mean(x[inds])
यह एक समान गणना है, लेकिन उम्मीद के रूप में के परिणाम समय हैं:
elapsed time: 0.007029772 seconds (96 bytes allocated)
elapsed time: 0.067880112 seconds (80000208 bytes allocated, 35.38% gc time)
तो, क्या मनमाने ढंग से स्मृति आवंटन समस्या के आसपास एक तरीका है inds
(और सरणी और फ़ंक्शन की मनमाने ढंग से पसंद) के hoices?
बहुत जानकारीपूर्ण (हमेशा के रूप में)। बहुत धन्यवाद। शायद यह जोड़ना उचित है कि 'sub' v0.3.5 (' sub (x, inds) 'में वेक्टर इंडेक्स के लिए काम नहीं करता है, मेरी मशीन पर एक त्रुटि फेंकता है, लेकिन काम करता है अगर 'sub' के दूसरे तर्क है एक श्रेणी वस्तु) –
'1: एन' और' [1: एन] 'के बीच भेद नोट करें, मेरा उत्तर देखें। – tholy
IainDunning, स्पष्ट करने के लिए: जहां आप कहते हैं "अब यह अच्छा नहीं है, लेकिन 0.4 जारी होने से पहले तय किया जाएगा," यह सच नहीं है। यह कंप्यूटर हार्डवेयर परमिट के रूप में पहले से ही अनुकूलित है, और जब 'उप' श्रेणी के साथ अनुक्रमण करना उतना ही कलाकार के रूप में 'व्यू' के रूप में होता है। एक श्रेणी के साथ इंडेक्सिंग के रूप में कलाकार के रूप में एक वेक्टर के साथ अनुक्रमण बनाने का कोई तरीका नहीं है। – tholy