সীমাবদ্ধ ভলিউম কোডের জন্য ডেটা স্ট্রাকচার: অ্যারে বনাম ক্লাসগুলি


11

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

অজগর শ্রেণীর জন্য উদাহরণ হতে পারে

class Cell:
   def __init__(self, x, y, z, U):

অ্যারে কেবল হিসাবে সংজ্ঞায়িত করা যেতে পারে

x[nx][ny][nz]
y[nx][ny][nz]
z[nx][ny][nz]
U[nx][ny][nz]

প্রভৃতি

উত্তর:


9

সহজ উত্তর: আধুনিক অজগরে প্রতিটি ডেটা টাইপ একটি শ্রেণি, তাই আনুষ্ঠানিকভাবে আপনার প্রস্তাবিত দুটি সমাধানের মধ্যে কোনও পার্থক্য নেই। (দয়া করে মনে রাখবেন নতুন-স্টাইলের ক্লাসগুলি ব্যবহার করুন: ক্লাসিক ক্লাসগুলি অপ্রচলিত! দেখুন http://docs.python.org/2/references/datamodel.html#new-style- এবং- ਕਲਾাসিক- ক্লাসগুলি )

এখন প্রশ্নটি হওয়া উচিত: আমি কীভাবে অজগরটিতে একটি কার্যকর ডেটা স্ট্রাকচারের ব্যবস্থা করব? কোনও সন্দেহ নেই যে কোষগুলি class Cellউদাহরণের অ্যারে হিসাবে সংগঠিত করার ধারণাটি খুব অদক্ষ। আপনি জটিল লিঙ্কযুক্ত তালিকার মতো সংগঠিত পয়েন্টার এবং অ-বিতর্কিত ডেটাগুলির একটি জগাখিচির সাথে শেষ করবেন। আপনার তালিকায় অবশ্যই সহজেই নতুন কক্ষ সন্নিবেশ করার ক্ষমতা রয়েছে: তবে আপনার কি এই বৈশিষ্ট্যটির প্রয়োজন? বিপরীতে আপনার অবিসংবাদিত ডেটা স্টোরেজ থাকবে এবং আপনাকে প্রতিটি স্তরে ইন্ডিয়ারেশনের বিভিন্ন স্তরের অ্যাক্সেস করতে হবে।

আপনি যদি আপনার numpy.ndarrayডেটাটিকে তত্ক্ষণাত্ সংগঠিত করেন তবে ডেটা মেমরি-সংলগ্ন হয় এবং বিভিন্ন কক্ষ অ্যাক্সেস করা সহজভাবে আপনার মেমরি ব্লকের মাধ্যমে চালিত হয়: স্থান দক্ষ (পয়েন্টারগুলির জন্য মেমরি নষ্ট হয় না) এবং দ্রুত

ইথান দ্বারা নির্দেশিত হিসাবে, ওও ধারণাগুলি ব্যবহার করা উচিত, তবে উচ্চতর স্তরে, একবার একটি দক্ষ নিম্ন স্তরের ডেটা কাঠামো কার্যকর করা হয়, সাধারণত এর মাধ্যমে numpy.ndarray

ওও প্রোগ্রামিং বলতে বোঝায় যে পদ্ধতিগুলিতে ডেটা বাঁধাই করা যেগুলি ডেটা নিজেই বিমূর্তির উচ্চ স্তরে ডেটা পরিচালনা করে। (উদাহরণস্বরূপ: আমি একটি এফইএম কোড প্রয়োগ করেছি, যেখানে স্টারনেস ম্যাট্রিক্সকে স্পার্স সুপার নোডাল কোলেস্কি ফ্যাক্টেরাইজেশনের জন্য একটি ক্লাস হিসাবে সংজ্ঞায়িত করা হয়েছিল The প্রথম বাস্তবায়নটি ছিল মূল: যখন বাইরের একটি বাস্তবায়ন প্রয়োজন হত, তখন এটি ছিল আন্ডারলাইনিং ডেটা সঞ্চয়স্থানের উত্তরাধিকার এবং ন্যূনতম সামঞ্জস্যের মাধ্যমে প্রাপ্ত হয়েছিল super সুপার-নোডাল কোলেস্কি কোডের প্রায় 100% পুনরায় ব্যবহার করা হয়েছিল))

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


@ ইথানকুন অন্য উত্তরের জন্য আপনার মন্তব্যের জন্য আপনাকে ধন্যবাদ, যে আমাকে নিজের লেখা লিখতে পরিচালিত করেছিল।
স্টেফানো এম

10

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

আমি আপনাকে যা করতে সুপারিশ করব,

  1. পাইথন স্ক্রিপ্ট লিখুন যা নম্পির সাথে কার্যকরী পদ্ধতির সাহায্যে আপনার সমস্যার সহজতম সংস্করণ সমাধান করে। উদাহরণস্বরূপ, যথেচ্ছ ইউনিটে সমস্ত কিছু থাকুন এবং কেবল 1D (বা 2 ডি) চেষ্টা করুন try কোডটি অগোছালো হলে এই পর্যায়ে এটি পুরোপুরি ঠিক। গুরুত্বপূর্ণ বিষয়টি হল আপনি নিজের প্রকল্পটি নিয়ে এগিয়ে চলেছেন।
  2. একবার আপনার কিছু কাজ করে। কোডটি ভার্বোস এবং প্রতিরোধক কোথায় তা সনাক্ত করুন। এই পর্যায়ে আপনি কীভাবে আপনার কোডটি সহজ করবেন সে সম্পর্কে বিভিন্ন ধারণার সাথে চারপাশে খেলতে পারেন। আপনি যেখানে নিজেকে পুনরাবৃত্তি করছেন সেদিকে খেয়াল রাখতে পারে এমন ফাংশনগুলি প্রবর্তন করুন। আপনি মূল সংস্করণটির সাথে তুলনা করতে পারেন যাতে আপনি জানেন যে আপনি বাগগুলি প্রবর্তন করছেন না।
  3. স্থিতিশীল দৃষ্টিভঙ্গি কোডের জটিলতা আরও কমিয়ে দেবে কিনা তা সিদ্ধান্ত নিন।

মূল বার্তাটি ক্লাস লেখা শুরু করা না হওয়া পর্যন্ত আপনি ইতিমধ্যে সহজতম উপায়ে সমস্যার সমাধান না করে। কোনও সমস্যা সমাধানের অভিজ্ঞতা অর্জনের মাধ্যমেই আপনি জানবেন কীভাবে আপনার অবজেক্ট অরিয়েন্টেড ইন্টারফেসটি সংজ্ঞায়িত করতে হয়। আপনি যদি হাতের আগে এটি করেন তবে সম্ভবত এটি পেতে পারে।


3
আমি এই বক্তব্যটির সাথে দৃ strongly়ভাবে একমত নই যে ওও সংখ্যাগত প্রোগ্রামিংয়ের জন্য উপযুক্ত নয়, তবে এটি যেখানে ভাল ফিট তা অনেক উচ্চ স্তরে। ওও পদার্থবিজ্ঞানের মডেল, মেসস, সলভার ইত্যাদি ইত্যাদির জন্য খুব দরকারী তবে কোষগুলির স্তরে প্রায় সবসময়ই অনুপযুক্ত।
ইথান কুন

পোস্টটিতে আমি সংখ্যার কোডের "অকাল অবজ্ঞা" এর সম্ভাব্য পিট ফলস সম্পর্কে সতর্ক করতে চেয়েছিলাম, বিশেষত যখন কোনওটি শুরু হয়। আমি বস্তু ব্যবহারে বিরূপ নই, আমার তৃতীয় পয়েন্টটি দেখুন: বস্তুগুলি যদি জটিলতা হ্রাস করতে পারে তবে তারা ভাল ধারণা good আমি সম্মত হই যে আপনি যে উদাহরণগুলি উদ্ধৃত করেছেন সেগুলি ভাল ব্যবহার, তবে সেই পর্যায়ে পৌঁছানোর জন্য অভিজ্ঞতার প্রয়োজন।
বয়ফ্যারেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.