অবজেক্ট ওরিয়েন্টেড বনাম ভেক্টর ভিত্তিক প্রোগ্রামিং


14

আমি অবজেক্ট অরিয়েন্টেড এবং ভেক্টর ভিত্তিক ডিজাইনের মধ্যে ছিঁড়েছি। আমি এমন ক্ষমতা, কাঠামো এবং সুরক্ষা পছন্দ করি যা বস্তুগুলি পুরো আর্কিটেকচারকে দেয়। তবে একই সাথে, গতি আমার কাছে খুব গুরুত্বপূর্ণ, এবং অ্যারেতে সাধারণ ভাসমান ভেরিয়েবলগুলি সত্যই ভেক্টর ভিত্তিক ভাষা / মতলব বা পাইথনের ন্যাপির মতো লাইব্রেরিতে সহায়তা করে।

আমার পয়েন্টটি চিত্রিত করার জন্য আমি এখানে লিখেছি কোডের একটি অংশ

সমস্যা: টো অস্থিরতা সংখ্যা যুক্ত করা। যদি x এবং y দুটি অস্থিরতা সংখ্যা হয় তবে অস্থিরতার যোগফল (x ^ 2 + y ^ 2) ^ 0.5 হয় (নির্দিষ্ট গাণিতিক অবস্থা ধরে নিলেও এটি এখানে গুরুত্বপূর্ণ নয়)।

আমি এই অপারেশনটি খুব দ্রুত সম্পাদন করতে চাই এবং একই সাথে আমার এটিও নিশ্চিত করা দরকার যে লোকেরা কেবলমাত্র ভুল পথে (x + y) অস্থিরতা যুক্ত না করে। এ দুটিই গুরুত্বপূর্ণ।

ওও ভিত্তিক নকশাটি এরকম কিছু হবে:

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 গুণ বেশি দ্রুত!

আপনি দেখতে পাচ্ছেন, ওওপি উপায়টি আমাকে প্রচুর সুরক্ষা দেয় যে লোকেরা ভোলাটিলিটি ভুল উপায়ে যুক্ত করবে না, তবে ভেক্টর পদ্ধতিটি এত দ্রুত উন্মাদ! এমন কোন নকশা আছে যাতে আমি উভয়ই পেতে পারি? আমি নিশ্চিত যে আপনারা অনেকগুলি একই ধরণের ডিজাইনের পছন্দগুলিতে চলে এসেছেন, আপনি কীভাবে এটি ব্যবহার করেন?

এখানে ভাষার পছন্দটি অবিরাম। আমি জানি আপনারা অনেকে পরামর্শ দিতেন যে সি ++ বা জাভা ব্যবহার করুন এবং কোডটি যেভাবেই ভেক্টর ভিত্তিক ভাষার চেয়ে দ্রুত চলতে পারে। তবে সে কথাটি নয়। আমার পাইথন ব্যবহার করা দরকার, কারণ আমার কাছে অনেকগুলি লাইব্রেরি রয়েছে যা অন্যান্য ভাষায় পাওয়া যায় না। এটাই আমার বাধা। এর মধ্যে আমার অনুকূলিতকরণ করা দরকার।

এবং আমি জানি, অনেক লোক সমান্তরালকরণ, জিপিজিপু ইত্যাদির পরামর্শ দিবে তবে আমি প্রথমে একক কোর কর্মক্ষমতা সর্বাধিক করতে চাই এবং তারপরে আমি কোডের উভয় সংস্করণকেই সমান্তরাল করতে পারি।

আগাম ধন্যবাদ!


3
এই সমস্যাটি সম্পর্কে ভেবে দেখার জন্য একটি নিবিড়ভাবে সম্পর্কিত উপায়: আপনি কি পারফরম্যান্সের জন্য অ্যারে (SoA) এর কাঠামো বা স্ট্রাকচারের একটি অ্যারে (AoS) ব্যবহার করবেন? সোএর সাথে ভেক্টরাইজ করা সহজ এবং এওএস বেশিরভাগ ভাষায় আরও ওওপি বান্ধব হয়ে উঠছে।
প্যাট্রিক

হ্যাঁ @ প্যাট্রিক, আপনি যদি প্রথম উত্তরটি দেখেন তবে আমার ধারণা বার্ট আপনি যে পয়েন্টটি তৈরি করছেন তার একটি ব্যবহারিক উদাহরণ দিয়েছেন। আমি কি সঠিক? আমি লক্ষ্য করেছি আপনি বেশিরভাগ ভাষা বলছেন , তাই এমন ভাষাগুলি আছে যেখানে উভয়ই পারফরম্যান্সে ঘনিষ্ঠ?
রামানুজ লাল

উত্তর:


9

আপনি দেখতে পাচ্ছেন, ওওপি উপায়টি আমাকে প্রচুর সুরক্ষা দেয় যে লোকেরা ভোলাটিলিটি ভুল উপায়ে যুক্ত করবে না, তবে ভেক্টর পদ্ধতিটি এত দ্রুত উন্মাদ! এমন কোন নকশা আছে যাতে আমি উভয়ই পেতে পারি? আমি নিশ্চিত যে আপনারা অনেকগুলি একই ধরণের ডিজাইনের পছন্দগুলিতে চলে এসেছেন, আপনি কীভাবে এটি ব্যবহার করেন?

আরও বড় অবজেক্ট ডিজাইন করুন। একটি Pixelবস্তুর একটি parallelized লুপ বা জিপিইউ ইমেজ রূপান্তরের বা যে মত কিছু জন্য কোন শ্বাস রুম আছে। একটি Imageএকটি পুঁচকে এর বাধা মধ্য দিয়ে যেতে হবে তা নয় উপলব্ধ নেই Pixelডেটা পেতে অবজেক্ট।


5

এটি সেই ক্ষেত্রগুলির মধ্যে একটি যেখানে সুনির্দিষ্ট উত্তর দেওয়া অসম্ভব, কারণ এটি বাণিজ্য বন্ধের বিষয়। যেমন আপনি খুঁজে পেয়েছেন, ওও বা ভেক্টর ভিত্তিক উভয়ই সর্বদা উন্নত নয় তবে এটি কীভাবে সফ্টওয়্যারটি ব্যবহৃত হবে তার উপর নির্ভর করে।

আপনি উভয়ের মধ্যে সেরাকে একত্রিত করার চেষ্টা করতে পারেন এবং একটি Volatilityঅবজেক্ট এবং অবজেক্ট উভয়ই তৈরি করার চেষ্টা করতে পারেন VolatilitySeries, যেখানে দ্বিতীয়টি ধারণাত্মকভাবে অস্থিরতা বিষয়গুলির একটি সিরিজ উপস্থাপন করে, তবে অভ্যন্তরীণভাবে স্টোরেজ পদ্ধতি ব্যবহার করে যা গণনাগুলি ভেক্টরাইজিংয়ের জন্য আরও উপযুক্ত উপযুক্ত (অ্যারের কাঠামো) uses । তারপরে আপনাকে কেবল আপনার ব্যবহারকারীদের শিক্ষিত করতে হবে যে ব্যবহার VolatilitySeriesকরা অনেক বেশি পছন্দসই Series(Volatility)


ধন্যবাদ বার্ট, এটি একটি ভাল ধারণা। প্রকৃতপক্ষে আমি আমার বর্তমান ডিজাইনের অংশগুলিতে সেভাবে চলেছি, যেখানে আর্থিক পরিমাণের মতো কিছু অবজেক্টগুলি সেভাবে নতুনভাবে ডিজাইন করা হয়েছিল। তবে শীঘ্রই আমি বুঝতে পারি যে আমার কোডটি সেই নির্দিষ্ট ডেটা কাঠামোর দাস হয়ে যায়। উদাহরণস্বরূপ VolatilitySeries, আপনার পরামর্শ অনুসারে যদি আমার কাছে একটি থাকে তবে আমার কাছে অস্থিরতা আইটেমগুলির listএকটি tupleবা একটি বা (পাইথনের সাথে আপনি পরিচিত DataFrameass এটি আমাকে বিরক্ত করে, কারণ তখন আমার আর্কিটেকচারটি ভালভাবে মাপেনি এবং কিছুক্ষণ পরে সুবিধাগুলি ম্লান হয়। এবং এটিই আমাকে এখানে নিয়ে আসে :) :)
রামানুজ লাল

অন্য ইস্যুটি হ'ল কেউ কাউকে এমন কোড লিখতে বাধা দিচ্ছে না volatilitySeries[0] + 3.0যা ভুল হবে। একবার থেকে মানগুলি ছাঁটাই করার পরে আপনি নীরব VolatilitySeriesহতে পারেন, তাই সুরক্ষা কেবল অল্প সময়ের জন্যই থাকে। বহুবর্ষীয় পরিবেশে যেখানে লোকেরা সর্বদা সঠিক শ্রেণীর ব্যবহার সম্পর্কে সচেতন হয় না, এটি অত্যন্ত সম্ভব। এবং আপনি জানেন, আপনি কেবল আপনার ব্যবহারকারীদের এত বেশি শিক্ষিত করতে পারেন। আমি জানি আপনি এটি বলবেন, আরে আমিও একই জিনিসটি করতে পারি যদি আমি বাধা দিতে পারি Volatility.valueতবে আপনি জানেন যে কমপক্ষে ব্যবহারকারী এখন সচেতন যে তিনি একটি বিশেষ মান ব্যবহার করছেন।
রামানুজ লাল

কেউ কেউ এটিকে সুপারিশ করতে পারে যে সমস্ত স্বাভাবিক ক্রিয়াকলাপগুলি উত্তরাধিকার সূত্রে প্রাপ্ত Seriesহয়েছে VolatilitySeries, তবে এটি পুরো উদ্দেশ্যকে পরাস্ত করে। আমি কি সেই পথ নিচে যাওয়া থেকে শিখেছে সুতরাং যে একটি হচ্ছে VolatilitySeriesবস্তুর শুধুমাত্র সত্যিই দীর্ঘ রান আউট কাজ করে পৃথক কোষ ধরনের Volatility
রামানুজ লাল

@ রামানুজলাল: অজগরটি কার্যকরভাবে সম্ভব কিনা তা নির্ধারণ করার জন্য আমি যথেষ্ট পরিমাণে জানি না VolatileSeries। আপনি যদি ইতিমধ্যে এটি চেষ্টা করে থাকেন এবং এটি কার্যকর না হয়, তবে আপনার সুরক্ষা এবং গতির মধ্যে পছন্দ করার জন্য কঠোর পছন্দ আছে। আমরা আপনাকে সেখানে সাহায্য করতে পারি না। (অন্য কারও কাছে উজ্জ্বল উত্তর না থাকলে)
বার্ট ভ্যান ইনজেন শেনাউ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.