2012-02-29 12 views
12

मेरे पास एक डेक ऑब्जेक्ट है जिसमें बड़ी मात्रा में डेटा है। मैं कतार के सामने से 4096 तत्व निकालना चाहता हूं (मैं इसे एक प्रकार का फीफो के रूप में उपयोग कर रहा हूं)। ऐसा लगता है कि 4096 पॉप अनुरोधों को फिर से शुरू किए बिना ऐसा करने का तरीका होना चाहिए।मैं डेक से कितने तत्व पॉप() पॉप कर सकता हूं?

क्या यह सही/कुशल/बेवकूफ है?

A = arange(100000) 
B = deque() 
C = [] # List will do 
B.extend(A) # Nice large deque 

# extract 4096 elements 
for i in xrange(4096): 
    C.append(A.popleft()) 
+3

, यह सही है। हां, यह उचित रूप से कुशल है हालांकि इसे आगे की सीमाओं और itertools के साथ बढ़ाया जा सकता है। नहीं, यह बेवकूफ नहीं है :-) –

उत्तर

3

तुम कहाँ एक deque.popleft() विधि का उपयोग कर रहे सच सामने बंद तत्वों हो रही का सबसे अच्छा तरीका है। आप इसमें अनुक्रमित कर सकते हैं, लेकिन सूचकांक प्रदर्शन डेक के बीच की ओर बढ़ता है (जैसा कि एक सूची के विपरीत है जिसमें त्वरित अनुक्रमित पहुंच है, लेकिन धीमी पॉप)। आप इसके साथ दूर हो सकते हैं (कोड की कुछ पंक्तियों को बचाता है):

A = arange(100000) 
B = deque(A) 
C = [B.popleft() for _i in xrange(4096)] 
+5

मुझे ओपी के संस्करण को थोड़ा बेहतर पसंद है। लेकिन अगर इसे एक लाइनर में पतन करने की आवश्यकता है, तो यहां कुछ तेज़ इटारेटोल्स वेरिएंट हैं: 'सी = मैप (लागू करें, दोहराएं (बी। पीपलप्लेट, 40 9 6)) 'या आप' सी = सूची (starmap (B.popleft, दोहराना ((), 40 9 6)) '' –

7

डेक्स के लिए कोई बहु-पॉप विधि नहीं है। Bugs.python.org पर एक सुविधा अनुरोध सबमिट करने के लिए आपका स्वागत है और मैं इसे जोड़ने पर विचार करूंगा।

मैं आपके उपयोग के मामले के विवरण पता नहीं है, लेकिन अपने डेटा 4096 के ब्लॉक में आता है, tuples या सूचियों में ब्लॉक के भंडारण और फिर Deque करने के लिए ब्लॉक जोड़ने पर विचार करें: हाँ

block = data[:4096] 
d.append(block) 
... 
someblock = d.popleft() 
+3

धन्यवाद रेमंड, डेक का उपयोग करने के कारणों में से एक अधिकतम लम्बाई पैरामीटर है - मैं इसे डेटा के लिए एक कंटेनर के रूप में उपयोग कर रहा हूं जो लगातार स्ट्रीम किया जा रहा है और इसलिए मैं आसानी से रखे गए डेटा की मात्रा को नियंत्रित कर सकता हूं। इसका फीफो पहलू भी अच्छा है। –

संबंधित मुद्दे