Lazy Evaluation এবং Memoization

Functional Programming Concepts (ফাংশনাল প্রোগ্রামিং কনসেপ্টস) - হ্যাস্কেল (Haskell) - Computer Programming

283

Haskell এ Lazy Evaluation এবং Memoization

Haskell একটি lazy evaluation ভাষা, যার মানে হল যে এক্সপ্রেশনগুলি তখনই মূল্যায়ন হয় যখন তাদের প্রয়োজন হয়। Memoization হল একটি কৌশল যা কম্পিউটেশনের সময় গৃহীত ফলাফলের caching বা সংরক্ষণ করে, যাতে পরে একই গণনা আবার না করতে হয়। Haskell এর lazy evaluation এবং memoization এই দুটি ধারণা খুবই সম্পর্কিত এবং ফাংশনাল প্রোগ্রামিংয়ে খুবই গুরুত্বপূর্ণ।


১. Lazy Evaluation (লেজি ইভ্যালুয়েশন)

Lazy Evaluation হল এমন একটি কৌশল যেখানে এক্সপ্রেশন তখনই মূল্যায়ন করা হয় যখন তার প্রয়োজন হয়, মানে, ডেম্যান্ড অনুযায়ী।

Haskell এ Lazy Evaluation এর মাধ্যমে এক্সপ্রেশনগুলির মূল্যায়ন পরে নির্দিষ্ট সময়ে করা হয়, যখন তাদের মানের প্রয়োজন হয়। এর ফলে, অপ্রয়োজনীয় গণনা এড়ানো যায় এবং ডেটা প্রসেসিং আরও কার্যকরী হয়।

Lazy Evaluation এর মূল ধারণা:

  • On-demand evaluation: একটি এক্সপ্রেশন তখনই মূল্যায়িত হবে যখন তার মানের প্রয়োজন পড়বে।
  • Non-strict semantics: Haskell এর ফাংশনগুলি non-strict, অর্থাৎ তাদের আর্গুমেন্টগুলি কেবল তখনই মূল্যায়ন হয় যখন সেগুলির প্রয়োজন হয়।

উদাহরণ: Lazy Evaluation

ধরা যাক, একটি লিস্ট তৈরি করা হচ্ছে যা একাধিক সংখ্যার গুণফল ধারণ করে:

infiniteList :: [Int]
infiniteList = [1..]

firstTen :: [Int]
firstTen = take 10 infiniteList

এখানে, infiniteList একটি অসীম লিস্ট যা সকল পূর্ণসংখ্যা ধারণ করে। কিন্তু firstTen ফাংশনটি কেবল প্রথম দশটি উপাদান নেয়। যেহেতু Haskell lazy evaluation ব্যবহার করে, infiniteList লোড হওয়ার সময়, সেটি আসলেই কখনো পুরো লোড হয় না। take 10 কেবল প্রথম দশটি উপাদান নিয়ে কাজ করবে, বাকি উপাদানগুলো অমূল্যায়িত থাকবে।

ব্যবহৃত:

Prelude> firstTen
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

এখানে, infiniteList এর সব উপাদান একসাথে মূল্যায়ন করা হয়নি, শুধুমাত্র firstTen এর জন্য প্রয়োজনীয় প্রথম দশটি উপাদান মূল্যায়ন করা হয়েছে।


২. Memoization (মেমোইজেশন)

Memoization হল একটি অপটিমাইজেশন কৌশল, যেখানে আপনি যে ফলাফলটি আগেই গণনা করেছেন তা সংরক্ষণ করে রাখেন, যাতে পরে যখন একই ইনপুট আসবে, তখন পুনরায় গণনা না করে সরাসরি সংরক্ষিত ফলাফল প্রদান করা হয়। এটি পুনরাবৃত্ত গণনা কমিয়ে ফাংশনগুলি দ্রুততর করে তোলে।

Haskell এ memoization সাধারণত lazy evaluation এর সাহায্যে সম্পন্ন হয়, কারণ Haskell কেবলমাত্র ফলাফল যখন প্রয়োজন তখনই গণনা করে এবং সেই ফলাফলটি cache করে রাখে।

উদাহরণ: Memoization in Fibonacci Sequence

ফিবোনাচ্চি সংখ্যার জন্য একটি সাধারণ রিকার্সিভ ফাংশন তৈরি করা যাক:

fib :: Int -> Integer
fib 0 = 0
fib 1 = 1
fib n = fib (n - 1) + fib (n - 2)

এই ফাংশনটি সঠিকভাবে কাজ করে, তবে এটি অনেক পুনরাবৃত্ত গণনা করে (যেমন, fib(5) গননা করতে গিয়ে আবার fib(3) এবং fib(2) আবার গণনা করা হচ্ছে)।

Memoization এর মাধ্যমে অপটিমাইজেশন

import Data.Map (Map, fromList, insert, lookup)

fibMemo :: Int -> Integer
fibMemo = (mapFib !!)
  where
    mapFib = 0 : 1 : [ fib' x | x <- [2..] ]
    fib' n = mapFib !! (n-1) + mapFib !! (n-2)

এখানে, memoization এর মাধ্যমে ফিবোনাচ্চি ফাংশনটি অপটিমাইজ করা হয়েছে। mapFib একটি লিস্ট তৈরি করেছে যেখানে প্রতিটি ফলাফল আগেই গণনা এবং সংরক্ষিত হয়েছে। এরপর, আমরা সরাসরি সেই ফলাফলটি ব্যবহার করতে পারি।

ব্যবহৃত:

Prelude> fibMemo 10
55

এখানে, ফিবোনাচ্চি গণনা দ্রুত হয়েছে কারণ আগের ফলাফলগুলো সংরক্ষিত ছিল এবং পুনরায় গণনা করা হয়নি।


৩. Lazy Evaluation এবং Memoization এর মধ্যে সম্পর্ক

Lazy evaluation এবং memoization একটি অপরকে পরিপূরকভাবে কাজ করে:

  • Lazy evaluation নিশ্চিত করে যে শুধুমাত্র প্রয়োজনীয় অংশগুলি মূল্যায়ন হয়।
  • Memoization নিশ্চিত করে যে, একবার যে মান গণনা হয়েছে, তা পরে একই ইনপুটের জন্য পুনরায় গণনা না করে সরাসরি ব্যবহার করা হবে।

এতে performance improvement এবং memory optimization ঘটতে পারে, কারণ cached results শুধুমাত্র একবার গণনা করা হয় এবং পুনরায় ব্যবহার করা হয়।


৪. Lazy Evaluation এবং Memoization এর সুবিধা

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

উপসংহার

Lazy Evaluation এবং Memoization Haskell এ অত্যন্ত শক্তিশালী এবং কার্যকরী কৌশল। Lazy evaluation এক্সপ্রেশনগুলির মূল্যায়ন শুধুমাত্র যখন তাদের প্রয়োজন হয় তখন করে, যা অতিরিক্ত গণনা এবং স্মৃতি ব্যবহার এড়িয়ে চলে। অন্যদিকে, memoization পূর্ববর্তী ফলাফলগুলিকে সংরক্ষণ করে এবং একই ইনপুটের জন্য পুনরায় গণনা এড়ায়। এই দুইটি কৌশল একসাথে ফাংশনাল প্রোগ্রামিংয়ের ক্ষমতাকে আরও বিস্তৃত করে এবং কর্মক্ষমতা উন্নত করতে সাহায্য করে।

Content added By
Promotion

Are you sure to start over?

Loading...