2015-05-27 12 views
5

मेरे पास ओपनब्लैस के साथ संकलित है और मुझे आश्चर्य है कि क्यों डिन की तुलना में इन्सम बहुत धीमी है (मैं 3 सूचकांक मामले में समझता हूं, लेकिन मुझे नहीं पता कि यह दो सूचकांक मामले में भी कम प्रदर्शनकारी क्यों है)? यहां एक उदाहरण:numpy.einsum से numpy.dot बहुत तेज़ क्यों है?

import numpy as np 
A = np.random.random([1000,1000]) 
B = np.random.random([1000,1000]) 

%timeit np.dot(A,B) 

Out: 10 loops, best of 3: 26.3 ms per loop 

%timeit np.einsum("ij,jk",A,B) 

Out: 5 loops, best of 3: 477 ms per loop 

क्या ईन्सम ओपनब्लैस और numpy.dot जैसे समांतरता का उपयोग करने का कोई तरीका है? एनपी.इन्सम क्यों न सिर्फ np.dot को कॉल करता है अगर यह एक डॉट उत्पाद को नोटिस करता है?

+0

संबंधित: http://stackoverflow.com/questions/20149201/why-is-numpys-einsum-slower-than-numpys-built-in-functions –

+0

यह सच है, लेकिन मेरे प्रश्न दो सूचकांक से संबंधित हैं मामला। दिए गए पद में दिए गए जवाब मुझे इंप्रेशन देते हैं कि तीन सूचकांक के साथ समस्याएं हैं। मुझे आश्चर्य हुआ कि इस विशिष्ट परीक्षा में गति का अंतर इतना प्रभावशाली है। – varantir

+3

क्योंकि ईन्सम सामान्य होने के लिए लिखा गया है और ब्लैस का उपयोग करने के लिए दो इंडेक्स डॉट उत्पाद विशेष मामले नहीं है। यह वास्तव में नीचे की रेखा है। यदि आप जानते हैं कि आपके पास केवल दो इंडेक्स हैं, तो बस डॉट का उपयोग करें। – BeRecursive

उत्तर

2

einsum इंडेक्स स्ट्रिंग को पार करता है, और उसके बाद nditer ऑब्जेक्ट बनाता है, और इसका उपयोग करता है कि समेकित उत्पादों का पुनरावृत्ति करने के लिए इसका उपयोग किया जाता है। इसमें विशेष मामले हैं जहां इंडेक्स सिर्फ धुरी स्वैप करते हैं, और रकम ('ii-> i')। इसमें 2 और 3 चर के लिए विशेष मामले भी हो सकते हैं (अधिक के विपरीत)। लेकिन यह बाहरी पुस्तकालयों का आह्वान करने का कोई प्रयास नहीं करता है।

मैंने एक शुद्ध पायथन काम-एक जैसा काम किया, लेकिन गणना के मामलों की तुलना में पार्सिंग पर अधिक ध्यान केंद्रित किया।

tensordot रीशेप और स्वैप, इसलिए यह वास्तविक गणनाओं के लिए dot पर कॉल कर सकता है।

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