2013-04-09 5 views
5

मैं निम्नलिखित अजगर कोड तेजी लाने के लिए कोशिश कर रहा हूँ:स्पीड अप अजगर पाश

for j in range(4,len(var_s),3): 
    mag_list.append(float(var_s[j])) 
mag_list = [value for value in mag_list if value != 99.] 
med_mag = np.median(mag_list) 

वहाँ एक में दो लोगों के लिए-छोरों गठबंधन करने के लिए एक अच्छा तरीका है? इस तरह, यह वास्तव में धीमा है। यदि मुझे उस प्रविष्टि का मूल्य 99 के बराबर नहीं है, तो मुझे पांचवीं के साथ शुरू होने वाली var_s सूची से प्रत्येक तीसरी प्रविष्टि निकालने की आवश्यकता है। परिणामी सूची में, मुझे औसत की आवश्यकता है। धन्यवाद!

+0

'med_mag = np.median ([v v में मानचित्र के लिए v (float, var_s [4 :: 3]) अगर v! = 99])'। सुनिश्चित नहीं है कि यह तेज़ है, लेकिन यह छोटा है। Droogans

+0

विभिन्न 'var_s' क्या डेटा-प्रकार हैं? क्या आपको वास्तव में प्रत्येक में से एक फ्लोट बनाने की आवश्यकता है? – mgilson

+1

क्या आपके पास कुछ बेंचमार्किंग करने के लिए नमूना डेटा सेट है? आपको मेरी जिज्ञासा मिली है =) –

उत्तर

12

आप शायद की कोशिश कर सकते:

mag_list = [value for value in var_s[4::3] if value != 99.] 

पर var_s निर्भर करता है, तो आप बेहतर itertools.islice(var_s,4,None,3) का उपयोग कर सकता है, लेकिन यह निश्चित रूप से पता करने के लिए समय समाप्त हो जाने की आवश्यकता होगी।

शायद आप अगर आप numpy पूरी तरह से साथ फंस भी बेहतर कर चाहते हैं: एक बार फिर

vs = np.array(var_s[4::3],dtype=np.float64) #could slice after array conversion too ... 
med_mag = np.median(vs[vs!=99.]) 

, इस को देखने के लिए कि यह कैसे दूसरों के सापेक्ष प्रदर्शन का समय समाप्त करने की आवश्यकता होगी।

+0

आप इसे एक फ्लोट पर भी डालना चाहते हैं? var_s में मान के लिए 'फ्लोट (वैल्यू) [4 :: 3] यदि मूल्य! = 99.' इसके अलावा, इंटरमीडिएट सूची को स्टोर करने की कोई ज़रूरत नहीं है अगर उसे जरूरत है तो वह औसत है। – Moshe

+0

@ मोशे - अच्छा बिंदु, मैंने उसे नोटिस नहीं किया। – mgilson

+0

इसका उपयोग करते समय मुझे निम्न त्रुटि मिलती है जब मैं mag_list का औसत प्राप्त करने का प्रयास करता हूं। कोई विचार यह कैसे ठीक करें? 'med_mag = np.median (mag_list) फ़ाइल" /usr/lib64/python2.6/site-packages/numpy/lib/function_base.py ", लाइन 2995, में औसत वापसी मतलब (अनुसार क्रमबद्ध [इंडेक्सर], अक्ष = अक्ष, आउट = आउट) फ़ाइल "/usr/lib64/python2.6/site-packages/numpy/core/fromnumeric।पीई ", लाइन 2488, मतलब आउट = आउट, keepdims = keepdims) फ़ाइल" /usr/lib64/python2.6/site-packages/numpy/core/_methods.py ", लाइन 51, _mean बाहर = आउट, keepdims = keepdims) टाइप एरर: लचीला प्रकार ' – frixhax

1
for j in range(4,len(var_s),3): 
    value = float(var_s[j]) 
    if value != 99: 
     mag_list.append(value) 
med_mag = np.median(mag_list) 
4
mag_list = filter(lambda x: x != 99, var_s[4::3]) 

ठीक है तो, यहाँ पायथन 2.7.2 में कुछ timeit परीक्षण, सब कर रहे हैं:

स्थापना:

>>> from random import seed, random 
>>> from timeit import Timer 
>>> from itertools import islice, ifilter, imap 
>>> seed(1234); var_s = [random() for _ in range(100)] 

पाश के लिए एक का उपयोग करना:

>>> def using_for_loop(): 
...  mag_list = [] 
...  for j in xrange(4, len(var_s), 3): 
...    value = float(var_s[j]) 
...    if value != 99: mag_list.append(value) 
... 
>>> Timer(using_for_loop).timeit() 
11.596584796905518 

का उपयोग करना मानचित्र और फ़िल्टर:

>>> def using_map_filter(): 
...  map(float, filter(lambda x: x != 99, var_s[4::3])) 
... 
>>> Timer(using_map_filter).timeit() 
8.643505096435547 

का उपयोग islice, IMAP, IFilter:

>>> def using_itertools(): 
...  list(imap(float, ifilter(lambda x: x != 99, islice(var_s, 4, None, 3)))) 
... 
>>> Timer(using_itertools).timeit() 
11.311019897460938 

एक सूची समझ और islice का उपयोग करना:

>>> def using_list_comp(): 
...  [float(v) for v in islice(var_s, 4, None, 3) if v != 99] 
... 
>>> Timer(using_list_comp).timeit() 
8.52650499343872 
>>> 

अंत में, islice के साथ एक सूची समझ का उपयोग करते हुए सबसे तेज, केवल थोड़ा द्वारा पीछा किया जाता मानचित्र और फ़िल्टर का धीमा उपयोग।

+0

बार-बार सीए की वजह से सूची की समझ से कुछ भी धीमा हो सकता है lambda समारोह तक एलएलएस - पायथन समारोह कॉल तुलनात्मक रूप से महंगा हैं। इसके अलावा, वहां पर जाने के लिए कास्ट प्राप्त करने के लिए आपको 'नक्शा (फ्लोट, फ़िल्टर (...)) जैसे कुछ का उपयोग करने की आवश्यकता है, एक बार की तुलना में दो बार लूपिंग करना, इसे कम * होने की संभावना भी कम करना। – lvc

+0

मानचित्र जनरेटर (कम से कम पायथन 3 में) देता है, इसलिए "दो बार लूपिंग" के बारे में चिंता न करें। – William

+0

जैसा कि, फ़िल्टर() 'करता है, लेकिन मैं आपका बिंदु @ एलवीसी देखता हूं। –

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