वस्तु उन्मुख बनाम वेक्टर आधारित प्रोग्रामिंग


14

मैं ऑब्जेक्ट ओरिएंटेड और वेक्टर आधारित डिज़ाइन के बीच फटा हुआ हूं। मुझे उन क्षमताओं, संरचना और सुरक्षा से प्यार है जो वस्तुएं पूरी वास्तुकला को देती हैं। लेकिन एक ही समय में, गति मेरे लिए बहुत महत्वपूर्ण है, और एक सरणी में सरल फ्लोट चर होने से वास्तव में वेक्टर आधारित भाषाओं / पुस्तकालयों जैसे कि पाइथन में मैटलैब या सुपीरियर में मदद मिलती है।

यहाँ एक कोड है जिसे मैंने अपनी बात समझाने के लिए लिखा है

समस्या: टो अस्थिरता संख्या जोड़ना। यदि x और y दो अस्थिरता संख्याएँ हैं, तो अस्थिरता का योग है (x ^ 2 + y ^ 2) ^ 0.5 (कुछ गणितीय स्थिति को देखते हुए लेकिन यह यहाँ महत्वपूर्ण नहीं है)।

मैं इस ऑपरेशन को बहुत तेजी से करना चाहता हूं, और साथ ही मुझे यह सुनिश्चित करने की आवश्यकता है कि लोग सिर्फ गलत तरीके (x + y) में अस्थिरता न जोड़ें। ये दोनों ही महत्वपूर्ण हैं।

OO आधारित डिजाइन कुछ इस तरह होगा:

from datetime import datetime 
from pandas import *

class Volatility:
    def __init__(self,value):
       self.value = value

    def __str__(self):
       return "Volatility: "+ str(self.value)

    def __add__(self,other):
        return Volatility(pow(self.value*self.value + other.value*other.value, 0.5))

(एक तरफ: उन लोगों के लिए जो पायथन के लिए नए हैं, __add__बस एक फ़ंक्शन है जो +ऑपरेटर को ओवरराइड करता है)

मान लीजिए कि मैं अस्थिरता मूल्यों की टो सूचियाँ जोड़ता हूं

n = 1000000
vs1 = Series(map(lambda x: Volatility(2*x-1.0), range(0,n)))
vs2 = Series(map(lambda x: Volatility(2*x+1.0), range(0,n))) 

(एक तरफ: फिर से, पायथन में एक श्रृंखला एक सूचकांक के साथ एक सूची की तरह है) अब मैं दोनों को जोड़ना चाहता हूं:

t1 = datetime.now()
vs3 = vs1 + vs2
t2 = datetime.now()
print t2-t1

बस इसके अलावा मेरी मशीन पर 3.8 सेकंड में चलता है, मैंने जो परिणाम दिए हैं उनमें ऑब्जेक्ट इनिशियलाइज़ेशन समय बिल्कुल भी शामिल नहीं है, इसका एकमात्र जोड़ कोड है जो समयबद्ध किया गया है। यदि मैं एक ही चीज़ को एरपी एरेज़ का उपयोग करके चलाता हूँ:

nv1 = Series(map(lambda x: 2.0*x-1.0, range(0,n)))
nv2 = Series(map(lambda x: 2.0*x+1.0, range(0,n)))

t3 = datetime.now()
nv3 = numpy.sqrt((nv1*nv1+nv2*nv2))
t4 = datetime.now()
print t4-t3

यह 0.03 सेकंड में चलती है। यह 100 गुना से अधिक तेज है!

जैसा कि आप देख सकते हैं, ओओपी तरीका मुझे बहुत सुरक्षा देता है कि लोग अस्थिरता को गलत तरीके से नहीं जोड़ेंगे, लेकिन वेक्टर विधि बस इतनी तेज़ है! क्या कोई डिज़ाइन है जिसमें मैं दोनों प्राप्त कर सकता हूं? मुझे यकीन है कि आप में से बहुत से लोग समान डिजाइन विकल्पों में भाग लेंगे, आपने इसे कैसे काम किया?

यहाँ भाषा का चुनाव सारहीन है। मुझे पता है कि आप में से बहुत से लोग सलाह देंगे कि सी ++ या जावा का उपयोग करें, और कोड वैसे भी वेक्टर आधारित भाषाओं की तुलना में तेजी से चल सकता है। लेकिन वह बात नहीं है। मुझे पायथन का उपयोग करने की आवश्यकता है, क्योंकि मेरे पास अन्य भाषाओं में उपलब्ध पुस्तकालयों की मेजबानी नहीं है। यही मेरी अड़चन है। मुझे इसके भीतर अनुकूलन करने की आवश्यकता है।

और मुझे पता है, कि बहुत सारे लोग समानांतरकरण, gpgpu आदि का सुझाव देंगे, लेकिन मैं पहले एकल कोर प्रदर्शन को अधिकतम करना चाहता हूं, और फिर मैं कोड के दोनों संस्करणों को समानांतर कर सकता हूं।

अग्रिम में धन्यवाद!


3
इस समस्या के बारे में सोचने का एक निकट संबंधी तरीका: क्या आपको प्रदर्शन के लिए सरणियों (SoA) की संरचना या संरचनाओं की एक सरणी (AoS) का उपयोग करना चाहिए? एसओए को वेक्टर करना आसान है और एओएस अधिकांश भाषाओं में ओओपी अनुकूल है।
पैट्रिक

हां @ पैट्रिक, यदि आप पहला उत्तर देखते हैं, तो मुझे लगता है कि बार्ट उस बिंदु का व्यावहारिक उदाहरण देता है जो आप बना रहे हैं। क्या मैं सही हू? मुझे लगता है कि आप अधिकांश भाषाओं को कहते हैं, तो क्या ऐसी भाषाएँ हैं जहाँ दोनों प्रदर्शन में करीब हैं?
रामानुज लाल

जवाबों:


9

जैसा कि आप देख सकते हैं, ओओपी तरीका मुझे बहुत सुरक्षा देता है कि लोग अस्थिरता को गलत तरीके से नहीं जोड़ेंगे, लेकिन वेक्टर विधि बस इतनी तेज़ है! क्या कोई डिज़ाइन है जिसमें मैं दोनों प्राप्त कर सकता हूं? मुझे यकीन है कि आप में से बहुत से लोग समान डिजाइन विकल्पों में भाग लेंगे, आपने इसे कैसे काम किया?

बड़ी वस्तुओं को डिजाइन करें। एक Pixelवस्तु एक parallelized पाश या GPU छवि परिवर्तनों या ऐसा कुछ के लिए कोई सांस लेने कमरा है। एक Imageप्रदान करता है यह Pixelडेटा पर प्राप्त करने के लिए एक नन्हा वस्तु के अवरोध से गुजरना नहीं है ।


5

यह उन क्षेत्रों में से एक है जहां निश्चित जवाब देना असंभव है, क्योंकि यह एक व्यापार-बंद की चिंता करता है। जैसा कि आपको पता चला, न तो ओओ, न ही वेक्टर-आधारित हमेशा बेहतर होता है, लेकिन यह सब इस बात पर निर्भर करता है कि सॉफ्टवेयर का उपयोग कैसे किया जाएगा।

आप दोनों के सर्वश्रेष्ठ को संयोजित करने और एक Volatilityऑब्जेक्ट और ऑब्जेक्ट दोनों बनाने की कोशिश कर सकते हैं VolatilitySeries, जहां दूसरी वैचारिक रूप से अस्थिरता वाली वस्तुओं की एक श्रृंखला का प्रतिनिधित्व करता है, लेकिन आंतरिक रूप से एक भंडारण विधि का उपयोग करता है जो संगणनाओं (सरणियों की एक संरचना) को वेक्टर करने के लिए अधिक उपयुक्त है । फिर आपको बस अपने उपयोगकर्ताओं को शिक्षित करना होगा कि उपयोग VolatilitySeriesकरना अधिक बेहतर है Series(Volatility)


धन्यवाद बार्ट, यह एक अच्छा विचार है। वास्तव में मैं अपने वर्तमान डिजाइन में उस तरह से भागों में गया हूं, जहां कुछ मात्राओं जैसे मौद्रिक राशि को फिर से डिजाइन किया गया था। लेकिन जल्द ही मुझे एहसास हुआ कि मेरा कोड उस विशेष डेटा संरचना का गुलाम बन जाता है। उदाहरण के लिए, यदि VolatilitySeriesआपके पास मेरा सुझाव है, तो मेरे पास अस्थिरता वाली वस्तुओं का ए list, tupleया (या आप पायथन से परिचित नहीं हैं) मान सकते हैं DataFrame। यह मुझे परेशान करता है, क्योंकि तब मेरी वास्तुकला अच्छी तरह से पैमाने पर नहीं होती है, और लाभ थोड़ी देर बाद दूर हो जाता है। और वही मुझे यहां लाता है :)।
रामानुज लाल

दूसरा मुद्दा यह है कि कोई भी किसी को कोड लिखने के लिए नहीं रोक रहा है volatilitySeries[0] + 3.0, जो गलत होगा। एक बार जब आप मूल्यों को छोड़ देते हैं VolatilitySeries, तो आप निडर हो सकते हैं, इसलिए सुरक्षा केवल अल्पकालिक है। एक बहुरूपी वातावरण में जहां लोगों को हमेशा सटीक वर्ग के उपयोग के बारे में पता नहीं होता है, यह बहुत संभव है। और आप जानते हैं, आप केवल अपने उपयोगकर्ताओं को इतना शिक्षित कर सकते हैं। मुझे पता है कि आप कहेंगे कि अरे, मैं भी ऐसा कर सकता हूं अगर मैं बाहर निकलता हूं Volatility.value, लेकिन आप जानते हैं, कम से कम उपयोगकर्ता को अब पता है कि वह एक विशेष मूल्य का उपयोग कर रहा है।
रामानुज लाल

कुछ यह भी सुझाव दे सकते हैं कि उन सभी सामान्य कार्यों को ओवरराइड किया गया है जो अंदर से विरासत Seriesमें मिले हैं VolatilitySeries, लेकिन यह पूरे उद्देश्य को हरा देता है। तो मैंने उस रास्ते से नीचे जाने से जो सीखा है, वह यह है कि कोई VolatilitySeriesवस्तु केवल वास्तव में लंबे समय तक काम करती है यदि व्यक्तिगत कोशिकाएं प्रकार की हों Volatility
रामानुज लाल

@RamanujLal: मुझे यह पता नहीं है कि VolatileSeriesदृष्टिकोण काफी व्यावहारिक है या नहीं यह निर्धारित करने के लिए पर्याप्त है । यदि आपने पहले से ही यह कोशिश की और यह काम नहीं किया, तो आपके पास सुरक्षा और गति के बीच चयन करने के लिए एक कठिन विकल्प है। हम वहां आपकी मदद नहीं कर सकते। (जब तक किसी और के पास एक शानदार जवाब नहीं है)
बार्ट वैन इनगेन शानौ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.