2013-07-09 8 views
19

मैं इंजीनियरिंग इंजीनियरिंग छात्र हूं जो वर्तमान में संख्यात्मक सिमुलेशन के प्रयोजनों के लिए MATLAB से Python में संक्रमण कर रहा है। मैं इस धारणा के तहत था कि मूल सरणी हेरफेर के लिए, न्यूम्पी MATLAB जितनी तेज होगी। हालांकि, यह दो अलग-अलग कार्यक्रमों के लिए प्रतीत होता है जो मैं लिखता हूं कि MATLAB कम से कम दो गुना जितना तेज़ है। परीक्षण कोड मैं Numpy के लिए उपयोग कर रहा हूँ (अजगर 3.3) है:MATLAB जितनी तेज़ी से न्यूम

import numpy as np 
import time 

a = np.random.rand(5000,5000,3) 

tic = time.time() 
a[:,:,0] = a[:,:,1] 
a[:,:,2] = a[:,:,0] 
a[:,:,1] = a[:,:,2] 
toc = time.time() - tic 
print(toc) 

MATLAB 2012a के लिए मैं उपयोग कर रहा हूँ जबकि:

a = rand(5000,5000,3); 

tic; 
a(:,:,1) = a(:,:,2); 
a(:,:,3) = a(:,:,1); 
a(:,:,2) = a(:,:,3); 
toc 

एल्गोरिथ्म मैं उपयोग कर रहा हूँ एक नासा website की तुलना पर इस्तेमाल किया जाता है बेवकूफ और MATLAB। वेबसाइट से पता चलता है कि इस एल्गोरिदम के लिए गति के मामले में Numpy MATLAB को पार करता है। फिर भी मेरे परिणाम नम्पी के लिए 0.4 9 एस सिमुलेशन टाइम और MATLAB के लिए 0.2 9 एस सिमुलेशन टाइम दिखाते हैं। मैंने नम्पी और मैटलैब दोनों पर गॉस-सेडल सॉल्वर भी चलाया है और मुझे इसी तरह के परिणाम मिलते हैं (16.5 एस बनाम 9.5 एस)

मैं पायथन के लिए नया ब्रांड हूं और प्रोग्रामिंग के मामले में बेहद साक्षर नहीं हूं। मैं WinPython 64 बिट पायथन वितरण का उपयोग कर रहा हूं लेकिन पाइथोनक्सी का कोई फायदा नहीं हुआ है।

एक बात जो मैंने पढ़ी है उसे प्रदर्शन में सुधार करना चाहिए एमकेएल का उपयोग कर बेवकूफ बना रहा है। दुर्भाग्य से मुझे नहीं पता कि विंडोज़ पर ऐसा कैसे करें। क्या मुझे यह करने की भी आवश्यकता है?

कोई सुझाव?

+0

क्रिस्टोफ गोहल्के इंटेल एमकेएल के खिलाफ जुड़े न्यूमपी के साथ कई पायथन पैकेजों के लिए विंडोज़ बाइनरी प्रदान करता है: http://www.lfd.uci.edu/~gohlke/pythonlibs/ – Amro

+0

हाँ। पाइथन मैटलैब के सापेक्ष धीमे होने के लिए भी इस्तेमाल होता था ताकि आप भाग्यशाली हों। :-) – horchler

+2

WinPython का वर्तमान वितरण [पहले से ही NumPy-MKL के साथ आता है] (https://code.google.com/p/winpython/wiki/PackageIndex_33)। – Jaime

उत्तर

51

यह तुलना कैशिंग के कारण संतरे से सेब होने के कारण समाप्त होती है, क्योंकि यह स्मृति के संगत हिस्सों पर स्थानांतरण या कुछ काम करने के लिए अधिक कुशल है। यह विशेष बेंचमार्क मेमोरी बाध्य है, क्योंकि वास्तव में कोई गणना नहीं की जाती है, और इस प्रकार अच्छे प्रदर्शन को प्राप्त करने के लिए कैश हिट का प्रतिशत महत्वपूर्ण है।

मैटलैब कॉलम-प्रमुख ऑर्डर (फोरट्रान ऑर्डर) में डेटा देता है, इसलिए a(:,:,k) मेमोरी का एक संगत हिस्सा है, जो कॉपी करने के लिए तेज़ है।

पंक्ति-प्रमुख क्रम (सी ऑर्डर) पर नकली डिफ़ॉल्ट, इसलिए a[:,:,k] में तत्वों के बीच बड़े कूद हैं और जो स्मृति हस्तांतरण को धीमा कर देते हैं। असल में, डेटा लेआउट चुना जा सकता है। मेरे लैपटॉप में, a = np.asfortranarray(np.random.rand(5000,5000,3)) एलडीएस के साथ सरणी बनाना 5x गति (1 एस बनाम 0.1 9 एस) तक।

यह परिणाम numpy-mKL और सादे numpy दोनों के लिए बहुत समान होना चाहिए क्योंकि एमकेएल एक तेज़ LAPACK कार्यान्वयन है और यहां आप इसका उपयोग करने वाले किसी भी फ़ंक्शन को कॉल नहीं कर रहे हैं (एमकेएल निश्चित रूप से रैखिक सिस्टम को हल करते समय, डॉट उत्पादों की गणना करने में मदद करता है। ..)।

मुझे सच में नहीं पता कि गॉस सेडल सॉल्वर पर क्या चल रहा है, लेकिन कुछ समय पहले मैंने Numpy running at half the speed of MATLAB नामक एक प्रश्न का उत्तर लिखा जो एमकेएल, एफएफटी और मैटलैब के जेआईटी के बारे में कुछ बात करता है।

+0

मैंने अभी देखा है कि यह डाउनवॉट किया गया था (यह मेरे लिए पहला है)। उत्तर में सुधार कैसे करें इस पर कोई टिप्पणी? – jorgeca

+0

ठीक है, मैंने अलग-अलग सरणी निर्माण का उपयोग करके आपके सुझाव की कोशिश की और यह भी Numpy में ~ 5x गतिशीलता का कारण बन गया जो कि महान है। मैंने अपने गॉस-सेडल सॉल्वर के साथ इस सुझाव की कोशिश की और इसमें कोई सुधार नहीं हुआ कि एक और समस्या है। मैं इस सॉल्वर में किसी भी फैंसी फ़ंक्शंस या किसी भी चीज़ का उपयोग नहीं कर रहा हूं, यह वेक्टरेटेड असाइनमेंट के लगभग 16 लाइनों और कुछ नियंत्रण कथन के साथ थोड़ी देर लूप है। पुराने विषय में आपने जो लिखा वह भी मेरी मदद नहीं करता है। क्या कोई तरीका है कि मैं आपको अपना कोड निरीक्षण करने के लिए भेज सकता हूं, या शायद इसे एक नए प्रश्न में पूछ सकता हूं? – nicholls

+0

चूंकि समस्या अलग दिखती है, इसलिए आप निश्चित रूप से एक और सवाल पूछ सकते हैं ताकि अधिक से अधिक लोगों को इससे फायदा हो सके! – jorgeca

3

आप नासा प्रयोग को फिर से बनाने का प्रयास कर रहे हैं, हालांकि आपने कई चर बदल दिए हैं।

  • आपका हार्डवेयर और ऑपरेटिंग सिस्टम अलग (www.nccs.nasa.gov/dali_front.html)
  • आपका अजगर संस्करण अलग है (2.5.3 बनाम 3.3) है
  • आपका MATLAB संस्करण: उदाहरण के लिए अलग है (2008 बनाम 2012)

नासा परिणामों का मानना ​​सही है, परिणामों में अंतर इन परिवर्तनों में से एक या अधिक के कारण होता है। मैं आपको सलाह देता हूं:

  • SciPy प्रीबिल्ट binaries के साथ सबसे तेज़।
  • अनुसंधान अगर इस प्रकार की गणना के सापेक्ष MATLAB पर कोई सुधार किया गया है तो अनुसंधान।

इसके अलावा, आपको this link उपयोगी मिल सकता है।

+0

मैंने शुरुआत में नासा के अध्ययन की तुलना करने की कोशिश की थी, हालांकि, मैं ज्यादातर यह देखने के लिए कह रहा था कि क्या ऐसा कुछ था जो मैं कर सकता था (या कुछ स्पष्ट) जिससे नम्पी धीमी हो सकती है। अगर जवाब यह था कि MATLAB I का संस्करण बस उपयोग कर रहा था, तो बस इतना ही आवश्यक था। हालांकि धन्यवाद। – nicholls