मैं बिना हस्ताक्षर किए 32 बिट इन्स की बड़ी संख्या (कई गीगाबाइट) स्टोर करने के लिए सरणी मॉड्यूल का उपयोग कर रहा हूं। प्रत्येक तत्व के लिए 4 बाइट्स का उपयोग करने के बजाय, अजगर 8 बाइट्स का उपयोग कर रहा है, जैसा कि array.itemsize द्वारा इंगित किया गया है, और pympler द्वारा सत्यापित किया गया है।क्या मैं पाइथन सरणी तत्वों को एक विशिष्ट आकार के लिए मजबूर कर सकता हूं?
जैसे:
>>> array("L", range(10)).itemsize
8
मैं तत्वों की एक बड़ी संख्या है, इसलिए मैं 4 बाइट के भीतर उन्हें संग्रहीत करने से लाभ होगा।
Numpy मुझे अहस्ताक्षरित 32 बिट ints के रूप में मान संग्रहीत करने देगा:
>>> np.array(range(10), dtype = np.uint32).itemsize
4
लेकिन समस्या यह है कि numpy के सूचकांक ऑपरेटर का उपयोग किसी भी आपरेशन है के बारे में दो बार के रूप में धीमी गति से, इसलिए कार्य है कि वेक्टर संचालन नहीं कर रहे हैं समर्थित numpy द्वारा धीमी हैं। जैसे:
python3 -m timeit -s "from array import array; a = array('L', range(1000))" "for i in range(len(a)): a[i]"
10000 loops, best of 3: 51.4 usec per loop
बनाम
python3 -m timeit -s "import numpy as np; a = np.array(range(1000), dtype = np.uint32)" "for i in range(len(a)): a[i]"
10000 loops, best of 3: 90.4 usec per loop
तो मैं करने के लिए मजबूर कर रहा हूँ या तो दुगनी हो जाती स्मृति का उपयोग के रूप में मैं चाहूँगा, या कार्यक्रम दो बार के रूप में धीमी गति से के रूप में मैं चाहूँगा चलेंगे। क्या इसके चारों ओर एक रास्ता है? क्या मैं निर्दिष्ट आइटम्स का उपयोग करने के लिए पाइथन एरे को मजबूर कर सकता हूं?
https://bugs.python.org/issue26821 –
यह एक झूठी डिचोटोमी है: आपका प्रोग्राम दोनों कम स्मृति का उपयोग कर सकते हैं और तेज़ी से हो सकते हैं। हालांकि यह सवाल से असंबंधित है कि आप विभिन्न प्लेटफार्मों पर एक निश्चित आकार 'सरणी' आइटम का उपयोग कर सकते हैं ('सरणी 'शायद मंच के मूल निवासी सी प्रकार का उपयोग करता है)। यह एक अलग प्रश्न है: कैसे विशिष्ट numpy- आधारित गणना तेजी से बनाने के लिए। – jfs