NumPy सरणी के लिए जोड़ बहुत अक्षम है। ऐसा इसलिए है क्योंकि दुभाषिया को प्रत्येक चरण में संपूर्ण सरणी के लिए स्मृति को खोजने और असाइन करने की आवश्यकता होती है। आवेदन के आधार पर, बहुत बेहतर रणनीतियां हैं।
आप पहले से लंबाई पता है, यह सरणी पूर्व आवंटित np.ones
, np.zeros
, या np.empty
की तरह एक समारोह का उपयोग करने के लिए सबसे अच्छा है।
desired_length = 500
results = np.empty(desired_length)
for i in range(desired_length):
results[i] = i**2
आप लंबाई को नहीं जानते हैं, यह शायद अधिक एक नियमित रूप से सूची में अपने परिणामों को रखने के लिए और एक सरणी के लिए इसे बाद में परिवर्तित करने के लिए कुशल है।
results = []
while condition:
a = do_stuff()
results.append(a)
results = np.array(results)
यहाँ अपने कंप्यूटर पर कुछ समय कर रहे हैं।
def pre_allocate():
results = np.empty(5000)
for i in range(5000):
results[i] = i**2
return results
def list_append():
results = []
for i in range(5000):
results.append(i**2)
return np.array(results)
def numpy_append():
results = np.array([])
for i in range(5000):
np.append(results, i**2)
return results
%timeit pre_allocate()
# 100 loops, best of 3: 2.42 ms per loop
%timeit list_append()
# 100 loops, best of 3: 2.5 ms per loop
%timeit numpy_append()
# 10 loops, best of 3: 48.4 ms per loop
तो आपको लगता है कि दोनों पूर्व आवंटन और एक सूची का उपयोग कर फिर रूपांतरण से बहुत तेजी से कर रहे हैं देख सकते हैं।
स्रोत
2014-09-03 16:59:53