2016-06-16 8 views
7

मुझे लगता है कि फोन करने np.inner गणना करने के लिए वर्गों की राशि था वर्गों के पूर्व परिकलित सरणी पर np.sum बुला से के बारे में 5x तेजी से हैरान था बनाम:योग - np.inner पहले बराबरी, तो संक्षेप

sum of squares code

इस व्यवहार में कोई अंतर्दृष्टि? मैं वास्तव में वर्गों के योग के बहुत तेज़ कार्यान्वयन में रूचि रखता हूं, इसलिए उन विचारों का भी स्वागत है।

उत्तर

5

जिसमें मॉड्यूल np.inner और np.sum कार्यान्वित कर रहे हैं मैं

>>> np.inner.__module__ 
'numpy.core.multiarray' 
>>> np.sum.__module__ 
'numpy.core.fromnumeric' 
>>> np.__file__ 
'/Users/uweschmitt/venv_so/lib/python3.5/site-packages/numpy/__init__.py' 

टाइप आप वास्तविक फ़ाइलों का निरीक्षण किया, तो आप देख सकते हैं कि numpy.core.multiarray एक शुद्ध सी मॉड्यूल है, जबकि numpy.core.fromnumeric पहले कुछ चेक और अजगर में रूपांतरण करता है की जाँच करने के एक दूसरे पायथन समारोह से पहले और फिर वास्तविक सारांश के लिए एक शुद्ध सी कार्यान्वयन कहा जाता है।

मुझे संदेह है कि पाइथन दुभाषिया से यह ओवरहेड मनाए गए समय अंतर को बताता है।

मैं एक बड़ा सरणी के साथ समय चलाने मेरी धारणा को साबित और मिल

In [8]: a = np.random.random(1000000) 
In [9]: %timeit np.inner(a, a) 
1000 loops, best of 3: 673 µs per loop 
In [10]: %timeit np.sum(a) 
1000 loops, best of 3: 584 µs per loop 

अब चलाने बार काफी समान हैं और एक छोटे से बदल अगर आप बयान, कभी कभी np.sum जीत, somtimes np.inner को दोहराने के लिए।

बड़ी सरणी के लिए np.sum का वास्तविक कार्य सी में किया जाता है और पाइथन दुभाषिया से निरंतर समय ओवरहेड नगण्य है।

+0

यह एक अच्छा अवलोकन है, लेकिन सरणी में तत्वों की संख्या में वृद्धि ने मेरे लिए समस्या को बढ़ा दिया। आपके पास 1 एम तत्वों के लिए, 'एनपी.इनर' ने 62.2 माइक्रोसॉन्ड लिया, जबकि 'np.sum' ने 1.04 एमएस लिया, या लगभग 17x लंबा, – bcf

+0

आप 'numpy' का किस संस्करण का उपयोग करते हैं? मेरे पास '1.11.0' है। – rocksportrocker

+0

और: क्या आपने कई बार समय चलाया? – rocksportrocker

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