मैं तुम्हें एक numpy
समाधान चाहते हैं पता है, तो यह है कि मापदंड (@ eumiro के पहले पोस्ट निश्चित रूप से करता है) को पूरा नहीं करता, लेकिन सिर्फ एक विकल्प के रूप में, यहाँ एक अनुकूलित अजगर संस्करण है जो आश्चर्यजनक रूप से (मेरे लिए कम से कम है) काफी तेज़ हो गया!
speeds = [i for i in speed if i > 0]
return sum(speeds)/(1.0 * len(speeds)) if sum(speeds) > 0 else 0.0
numpy (या मूल) गति के मामले में कार्यान्वयन के साथ इस तुलना करने के लिए दिलचस्प हो सकता है।
In [14]: timeit original(speed) # original code
1000 loops, best of 3: 1.13 ms per loop
In [15]: timeit python_opt(speed) # above Python 2 liner
1000 loops, best of 3: 582 us per loop
In [16]: timeit avg_positive_speed(speed) # numpy code
1000 loops, best of 3: 1.2 ms per loop
जहां
speed = range(10000)
मैं सोचा होगा कि numpy
बढ़त यहाँ होता .. किसी को पता क्यों यह ट्रेल्स?
अद्यतन:
speed = range(100000)
साथ:
In [19]: timeit original(speed)
100 loops, best of 3: 12.2 ms per loop
In [20]: timeit python_opt(speed)
100 loops, best of 3: 11 ms per loop
In [21]: timeit avg_positive_speed(speed)
100 loops, best of 3: 12.5 ms per loop
अभी भी यकीन नहीं है कि numpy
इस विशेष समस्या के लिए एक अच्छा उपकरण है, जब तक कि वहाँ गति की एक विशाल संख्या में हैं :)
numpy मेमोरी मेमोरी कैसे करता है? सूची की समझ कुछ बिंदुओं पर कुछ बिंदुओं पर टक्कर लगी होगी।
बड़ी संख्या में आज़माएं। 1000 के साथ, एक सूची से एक सरणी में रूपांतरण समय पर हावी है। –
@ जोकिंगटन अभी यह कर रहा है .. :) – Levon
ध्यान रखें कि एक बड़ी सूची में एक numpy सरणी में रूपांतरण अपेक्षाकृत धीमी प्रक्रिया है। यदि डेटा पहले से ही एक numpy सरणी है (जो एक सूची से _far_ कम स्मृति का उपयोग करता है) तो numpy संस्करण बहुत तेज हो जाएगा। अन्यथा, आपको एक ही ऑपरेशन के लिए एक बड़ा अंतर दिखाई नहीं देगा, क्योंकि अधिकांश समय सूची को सरणी में परिवर्तित करने के लिए खाया जाएगा। –