পাইথন পারফরম্যান্স: নেটিভ নামপাই লুপ, কলব্যাক এবং রূপান্তর খরচ
একটি নিয়ন্ত্রিত সিপিইউ-মাত্র সংখ্যাসূচক পরীক্ষা সিপাইথন লুপ, নামপাই গাণিতিক, একটি পাইথন কলব্যাক র্যাপার এবং একটি সংকলিত নাম্বা লুপের মাধ্যমে অভিন্ন মানগুলিকে অনুসরণ করে।
একটি নিয়ন্ত্রিত সিপিইউ-মাত্র সংখ্যাসূচক পরীক্ষা সিপাইথন লুপ, নামপাই গাণিতিক, একটি পাইথন কলব্যাক র্যাপার এবং একটি সংকলিত নাম্বা লুপের মাধ্যমে অভিন্ন মানগুলিকে অনুসরণ করে। রেডি-ইনপুট নামপাইয়ের একটি বড় লিড ছিল, যখন পাইথন তালিকা থেকে এবং তাতে রূপান্তর সেই সুবিধাকে প্রায় সমান করে দিয়েছে। এই পর্বটি এক্সিকিউশন বাউন্ডারি এবং একটি অ্যাপ্লিকেশনকে যে ফলাফল দরকার তা কীভাবে পরিমাপ করা যায় তা ব্যাখ্যা করে।
লিখিত সংস্করণ পড়ুন (ইংরেজি) ↗
এই ভিডিওতে যা আছে
- CPython সোর্স কোডকে বাইটকোডে কম্পাইল করে। পুনরাবৃত্ত ইন্টারপ্রেটার/অবজেক্ট কাজ এবং একটি টাইপ করা নেটিভ সংখ্যাসূচক লুপ ভিন্ন এক্সিকিউশন ব্যবস্থা।
- সংখ্যাসূচক নামপাই গাণিতিক টাইপ করা ব্যাচগুলিকে কম্পাইল করা অপারেশনগুলিতে দিতে পারে; গাণিতিক লুপটি এখনও বিদ্যমান, এবং ভিউগুলির অসংলগ্ন বিন্যাস থাকতে পারে।
- রূপান্তর এবং প্রয়োজনীয় আউটপুট উপস্থাপনা পরিমাপ করুন। এই রানে, পাইথন তালিকাগুলিকে অ্যারেতে এবং আবার ফিরিয়ে আনা বড় রেডি-অ্যারের লিড মুছে দিয়েছে।
- ছোট কাজের চাপ সাধারণ পাইথনকে সমর্থন করতে পারে কারণ ফিক্সড অ্যারে-কল খরচ গুরুত্বপূর্ণ। আট-মানের কমপ্রিহেনশন এই পরিমাপ করা তুলনা জিতেছে।
- np.vectorize হল একটি সুবিধার র্যাপার যা পরবর্তী উপাদানগুলির জন্য পাইথনকে কল করে; একটি ব্যাচ ইন্টারফেস একা নেটিভ সংখ্যাসূচক এক্সিকিউশন প্রতিষ্ঠা করে না।
- কম্পাইল করা পাইথন-সিনট্যাক্স লুপগুলিও দ্রুত হতে পারে। কলকারীর জন্য যখন গুরুত্বপূর্ণ হয় তখন কোল্ড কম্পাইলেশন/সেটআপ খরচ অন্তর্ভুক্ত করুন।
- নেটিভ এক্সিকিউশন, সিপিইউ সিমড, মাল্টিথ্রেডিং এবং জিপিইউ ব্যাকএন্ডগুলি পৃথক ধারণা। উপলব্ধ সিপিইউ বৈশিষ্ট্যগুলি একটি নির্দিষ্ট রানে ব্যবহৃত নির্দেশাবলী সনাক্ত করে না।
অনুবাদিত প্রতিলিপি
মূল ইংরেজি বর্ণনা থেকে অনূদিত। উপলব্ধ অডিও এবং ক্যাপশন YouTube দ্বারা নিয়ন্ত্রিত।
একই সিপিইউ কেন দ্রুত শেষ করতে পারে?
0:00 আপনি মনে করেন পাইথনকে দ্রুত হতে হলে একটি নতুন ভাষার প্রয়োজন। লুপ সরানোর পর একই সিপিইউ আমাদের ব্যাচ দ্রুত চালিয়েছিল। কাজটা কোথায় গেল? কখন গতি বৃদ্ধি উধাও হয়ে যায়? কোন শর্টকাট পাইথনকে ফিরিয়ে আনে? এটি দ্য ডেইলি ডিফার, হুড-এর নিচে। সেই শর্টকাটটির দিকে নজর রাখুন। CPython হলো স্ট্যান্ডার্ড পাইথন ইমপ্লিমেন্টেশন।
0:17 এটি আপনার সোর্স কোডকে বাইটকোডে কম্পাইল করে, তারপর ইন্টারপ্রেটারে সেই নির্দেশাবলী চালায়। NumPy একটি সংখ্যাসূচক লাইব্রেরি যার অ্যারেতে ঘোষিত ডেটা টাইপ সহ মান থাকে। এর অন্তর্নির্মিত গাণিতিক একটি সম্পূর্ণ ব্যাচকে সংকলিত অপারেশনগুলিতে হস্তান্তর করতে পারে। দশ লক্ষ ফ্লোটিং পয়েন্ট মান নিন, প্রতিটি বর্গ করুন, তারপর আসল মান যোগ করুন। প্রতিটি সংস্করণ অভিন্ন মান পায় এবং মিলে যাওয়া উত্তর তৈরি করে। মানগুলি এত ছোট যে গোলমাল পার্থক্যগুলি দৌড় থেকে দূরে থাকে। এই মেশিনে, কমপ্রিহেনশন প্রায় ৩৩ মিলিসেকেন্ড সময় নিয়েছে।
0:40 নামপাই এক সেকেন্ডেরও কম সময় নিয়েছে। উভয়ই সিপিইউতে চলেছে। এই কাজের বোঝার জন্য এটি দরকারী প্রমাণ, এবং একটি প্রোগ্রামিং ভাষার জন্য একটি ভয়ানক শোক সংবাদ। সাধারণ লুপ দিয়ে শুরু করুন। পাইথন পরবর্তী মান পায়, গাণিতিক ক্রিয়া সম্পাদন করে এবং উত্তর যুক্ত করে। তারপর এটি আবার করে।
একটি পাইথন লুপ কী কাজ পুনরাবৃত্তি করে?
0:53 গুণ করা সস্তা। পরবর্তী গুণিতক সাজানো, এবং এর চারপাশে পাইথন অবজেক্টগুলি পরিচালনা করা, প্রতিবার কাজ বাড়িয়ে দেয়। এটি পরীক্ষিত ফাংশনের প্রকৃত ডিসসেম্বলি। ইটেরেশন, গুণ এবং যোগ বাইটকোড নির্দেশাবলী হিসাবে প্রদর্শিত হয়। পাইথন সংস্করণ এবং ইন্টারপ্রেটারগুলি ভিন্ন পছন্দ করে। এই সময়গুলি স্ক্রিনে প্রদর্শিত সংস্করণের সাথে সম্পর্কিত, যা পাইথন ৩.১০। একটি পাইথন তালিকা অবজেক্টের রেফারেন্স সঞ্চয় করে, তাই বিভিন্ন ধরণের জিনিস একটি তালিকা শেয়ার করতে পারে। আমাদের গাণিতিক কাজ জুড়ে সংখ্যা ব্যবহার করে।
1:14 এটি একটি পুনরাবৃত্তিমূলক পরিষেবার অনুরোধ করার সময় একটি সাধারণ ব্যবস্থার জন্য অর্থ প্রদান করে। কল্পনা করুন যে আপনি একই কফি দশ লক্ষ বার অর্ডার করছেন এবং প্রতিটি কাপের জন্য একটি নতুন ফর্ম পূরণ করছেন। কফি মেশিন ঠিক আছে। কাগজপত্র তার নিজস্ব ক্যারিয়ার তৈরি করেছে। NumPy চুক্তি পরিবর্তন করে। এই অ্যারেতে একটি ঘোষিত টাইপ সহ নির্দিষ্ট আকারের ফ্লোটিং পয়েন্ট মান থাকে। আমাদের অ্যারেটি সংলগ্ন, তাই এর মানগুলি মেমরিতে একসাথে থাকে। ভিউগুলির অন্যান্য বিন্যাস থাকতে পারে।
1:36 গাণিতিক অপারেশনটি জানে এটি কী ধরনের ডেটা গ্রহণ করছে।
নামপাই লুপটি কোথায় নিয়ে যায়?
1:38 কলটি ব্যাচটিকে একটি নেটিভ অপারেশনে পাঠায়। একটি লুপ এখনও কম্পাইল করা কোডের ভিতরে মানগুলি পরিদর্শন করে। এটি সেই কাজের জুড়ে টাইপের জ্ঞান পুনরায় ব্যবহার করতে পারে। পাইথন এখনও কাজটি হস্তান্তরকারী ব্যক্তি হিসেবে থাকে। ইতামার টার্নার ট্রাুরিং পাইথন স্পিড-এ এই পার্থক্যটি ব্যাখ্যা করেছেন। ব্যাচ ইন্টারফেস, নেটিভ ইমপ্লিমেন্টেশন এবং প্রসেসর ভেক্টর নির্দেশাবলী আলাদা জিনিস। ফাংশনের নামটি খুব কম প্রমাণ সরবরাহ করে। এই ফলাফলটি সিপিইউতে NumPy ব্যবহার করেছে। CuPy-এর মতো একটি GPU ব্যাকএন্ড অ্যারে এবং অপারেশনগুলির জন্য একটি ভিন্ন স্থান বেছে নেয়।
2:00 একটি GPU কিনলে এই সাধারণ পাইথন লুপটি যেখানে আগে চলতো সেখানেই চলতে থাকে। সিপিইউ ভেক্টর নির্দেশাবলী একসাথে বেশ কয়েকটি মান প্রক্রিয়া করতে পারে। NumPy-এর সমর্থিত কার্নেল বেছে নেওয়ার জন্য সরঞ্জাম রয়েছে। আমাদের রানটাইম উপলব্ধ বৈশিষ্ট্যগুলি রিপোর্ট করে, কিন্তু এই এক্সপ্রেশনের নির্দেশাবলী ট্রেস করে না। সম্পূর্ণ পরিমাপ করা লাভ ভেক্টর নির্দেশাবলীকে দেওয়া হলে প্রমাণগুলিকে অতিরঞ্জিত করা হবে।
দ্রুত মানে কি জিপিইউ নাকি অনেক সিপিইউ কোর?
2:13 জিপিইউ কেনাকাটার কার্ট বন্ধ থাকতে পারে। কর্মক্ষমতা ঠিক করার এমন একটি গভীর সন্তুষ্টি রয়েছে যা একটি কেনাকাটাও বাতিল করে দেয়। দুর্ভাগ্যবশত, বেঞ্চমার্ক অব্যাহত থাকে। আটটি মান সহ, কমপ্রিহেনশন জিতেছিল। অ্যারে মেশিনারি কল করার খরচ ছোট কাজের চেয়ে বেশি ছিল। বৃহত্তর রেডি অ্যারে এগিয়ে গিয়েছিল। আমরা বারবার পরীক্ষা এবং একটি উষ্ণ প্রক্রিয়া ব্যবহার করেছি। নতুন পাইথন বিল্ডগুলি ক্রসওভার পরিবর্তন করতে পারে। তারপর অ্যাপ্লিকেশনটির যা প্রয়োজন তা পরিবর্তন করুন।
2:40 একটি পাইথন তালিকা দিয়ে শুরু করুন এবং একটি নতুন পাইথন তালিকা দিয়ে শেষ করুন। NumPy-কে ইনপুটটিকে একটি অ্যারেতে রূপান্তর করতে হবে এবং উত্তরটিকে আবার পাইথন অবজেক্টে পরিণত করতে হবে। আপনার অ্যাপ্লিকেশনটির যদি এই ধাপগুলির প্রয়োজন হয় তবে সেগুলি বিলের অন্তর্ভুক্ত করা উচিত। দশ লক্ষ মানে, সেই সম্পূর্ণ পথটি প্রায় ২৮ মিলিসেকেন্ড সময় নিয়েছে।
কখন চিত্তাকর্ষক গতি বৃদ্ধি অদৃশ্য হয়ে যায়?
2:49 কমপ্রিহেনশনও প্রায় ২৮ নিয়েছে। আমাদের নাটকীয় লিড প্রায় সমান হয়ে গেল। দ্রুত অংশটি বাস্তব ছিল। সুবিধাটি ডেটাটিকে তার সংখ্যাসূচক আকারে থাকতে দেওয়ার উপর নির্ভর করে। ডেটা অনুসরণ করুন। যদি পরবর্তী অপারেশন একটি অ্যারে গ্রহণ করে, তবে অ্যারেটি রাখুন। যদি আপনি বারবার তালিকা এবং অ্যারেগুলির মধ্যে রূপান্তর করেন, সেই রূপান্তরগুলি পরিমাপ করুন।
3:11 একটি ব্যয়বহুল হ্যান্ডঅফের আগে থামা ভুল প্রশ্নের জন্য সঠিক সংখ্যা দেয়। এই অ্যারেটি গুণ করলে একটি অস্থায়ী ফলাফল তৈরি হয়। আসল মানগুলি যোগ করলে আউটপুট তৈরি হয়। নেটিভ এক্সিকিউশনের এখনও মেমরি এবং ডেটা সরানোর প্রয়োজন। কিছু অপারেশন একটি আউটপুট বাফার গ্রহণ করে, যখন আপনার কোড নিরাপদে এটি পুনরায় ব্যবহার করতে পারে তখন বরাদ্দ হ্রাস করে। একটি সুন্দর লাইন বেশ কয়েকটি বড় বাফার অর্ডার করতে পারে।
কোন সীমানাগুলি বেঞ্চমার্কে অন্তর্ভুক্ত করা উচিত?
3:28 পাইথন স্পিডও এই সমস্যাটি তুলে ধরে। অ্যালকেটার আপনার নান্দনিকতার প্রতি অসাধারণভাবে উদাসীন। আপনি লুপ সিনট্যাক্সও রাখতে পারেন এবং এর এক্সিকিউশন পরিবর্তন করতে পারেন। নাম্বা সমর্থিত সংখ্যাসূচক পাইথন ফাংশনগুলিকে নেটিভ কোডে কম্পাইল করতে পারে। এখানে আমাদের পরীক্ষার লুপটি তার কম্পাইলার ডেকোরেটর সহ রয়েছে। এটি এখনও 'for' বলে। ব্যয়বহুল ইন্টারপ্রেটার পথ পরিবর্তিত হয়েছে। সংকলনের পরে, এই লুপটি রেডি অ্যারে সহ আধা মিলিসেকেন্ডেরও কম সময় নিয়েছে। এই রানে সংকলন নিজেই প্রায় এক সেকেন্ড সময় নিয়েছে।
3:47 সেই সেটআপ খরচ বারবার সময় পরিমাপ থেকে বাদ দেওয়া হয়েছিল, তাই একটি ছোট এককালীন কাজের জন্য একটি ভিন্ন তুলনা প্রয়োজন। নাম্বার নিজস্ব গাইড স্পষ্ট লুপ দেখাতে খুশি। হট পাথ খুঁজে বের করার আগে একটি ভাষা স্থানান্তরের শুরু একটি প্রোফাইলার খোলার এড়ানোর একটি বিস্তারিত উপায়।
একটি কম্পাইল করা পাইথন লুপও কি দ্রুত হতে পারে?
4:00 প্রথমে খুঁজে বের করুন কী সময় খরচ করছে। নেটওয়ার্ক অপেক্ষা, অবজেক্ট পার্সিং এবং বাল্ক অ্যারিথমেটিকের জন্য বিভিন্ন ফিক্স প্রয়োজন। যখন গণনা এবং ডেটা ফিট করে তখন নেটিভ অ্যারে অপারেশনগুলি সহায়তা করে। আপনার কলকারী আসলে যে ফলাফলটি চায় তা পরিমাপ করুন। এবার সেই শর্টকাটটির জন্য। আপনার একটি পাইথন ফাংশন আছে এবং আপনি চান এটি একটি অ্যারে গ্রহণ করুক। vectorize নামক একটি র্যাপার যেন অনুপস্থিত পারফরম্যান্স বোতামের মতো শোনাচ্ছে। এর ডকুমেন্টেশনে একটি গুরুত্বপূর্ণ বাক্য অপেক্ষা করছে।
4:22 NumPy বলে এর vectorize র্যাপারটি প্রাথমিকভাবে সুবিধার জন্য সরবরাহ করা হয়েছে। এর বাস্তবায়ন মূলত একটি ফর লুপ। র্যাপারটি ব্যাচ গ্রহণ করে, তবে পরবর্তী উপাদানগুলির জন্য আপনার পাইথন ফাংশন কল করতে থাকে। ইন্টারফেসটি ছোট হয়েছে। এক্সিকিউশন বাউন্ডারি ব্যস্ত ছিল। পাইথন কলব্যাকের মাধ্যমে একই মানগুলি ফিরে আসতে দেখুন। রেডি অ্যারে সহ, এই সংস্করণটি প্রায় ৮৭ মিলিসেকেন্ড সময় নিয়েছে। এটি আমাদের কমপ্রিহেনশনের চেয়ে ধীর ছিল। একটি দরকারী ব্রডকাস্টিং র্যাপার আপনি যে প্রতি-এলিমেন্ট কাজগুলি সরাতে চেষ্টা করছিলেন তা সঠিকভাবে বজায় রাখতে পারে।
4:43 একটি ব্যাচ ইন্টারফেসের পিছনের বাস্তবায়ন পরীক্ষা করুন, সামঞ্জস্যপূর্ণ ডেটাকে তার দরকারী আকারে রাখুন এবং তুলনাতে রূপান্তর অন্তর্ভুক্ত করুন। কলকারীর আসন থেকে নেটিভ, কলব্যাক এবং কম্পাইল করা লুপগুলি একই রকম দেখতে পারে। vectorize নামটি এমন একটি প্রতিশ্রুতি দিয়েছিল যা আপনার স্টপওয়াচ কখনও স্বাক্ষর করেনি। যখন সুবিধা আপনার প্রয়োজন তখন এটি রাখুন। পারফরম্যান্সের জন্য, যে লুপটি চলে তা পরীক্ষা করুন।
np.vectorize আসলে কী এক্সিকিউট করে?
4:56 আমার রায় হল একটি পরিমাপ করা সংখ্যাসূচক হট পাথের ব্যাচিংয়ের জন্য SHIP IT। যখন তারা ইতিমধ্যেই ভালোভাবে কাজ করে তখন সাধারণ লুপগুলি রাখুন। কাজটি কোথায় ঘটে এবং পরবর্তী কলকারীর কী প্রয়োজন তা পরীক্ষা করুন। সাবস্ক্রাইব করুন, বেল টিপুন এবং মন্তব্যগুলিতে আমাকে জানান যে আপনি এটি ভিন্নভাবে স্ট্যাম্প করতেন কিনা। এবং আজকের জন্য এটাই পার্থক্য। আমি Axrisi থেকে Niko। দায়িত্বের সাথে মার্জ করুন। আমার রায় হল একটি পরিমাপ করা সংখ্যাসূচক হট পাথের ব্যাচিংয়ের জন্য SHIP IT।
5:18 যখন তারা ইতিমধ্যেই ভালোভাবে কাজ করে তখন সাধারণ লুপগুলি রাখুন। কাজটি কোথায় ঘটে এবং পরবর্তী কলকারীর কী প্রয়োজন তা পরীক্ষা করুন। সাবস্ক্রাইব করুন, বেল টিপুন এবং মন্তব্যগুলিতে আমাকে জানান যে আপনি এটি ভিন্নভাবে স্ট্যাম্প করতেন কিনা। এবং আজকের জন্য এটাই পার্থক্য। আমি Axrisi থেকে Niko। দায়িত্বের সাথে মার্জ করুন। আমার রায় হল একটি পরিমাপ করা সংখ্যাসূচক হট পাথের ব্যাচিংয়ের জন্য SHIP IT। যখন তারা ইতিমধ্যেই ভালোভাবে কাজ করে তখন সাধারণ লুপগুলি রাখুন।
আপনার কোডে কী পরিবর্তন করা উচিত?
5:41 কাজটি কোথায় ঘটে এবং পরবর্তী কলকারীর কী প্রয়োজন তা পরীক্ষা করুন। সাবস্ক্রাইব করুন, বেল টিপুন এবং মন্তব্যগুলিতে আমাকে জানান যে আপনি এটি ভিন্নভাবে স্ট্যাম্প করতেন কিনা। এবং আজকের জন্য এটাই পার্থক্য। আমি Axrisi থেকে Niko। দায়িত্বের সাথে মার্জ করুন। আমার রায় হল একটি পরিমাপ করা সংখ্যাসূচক হট পাথের ব্যাচিংয়ের জন্য SHIP IT। যখন তারা ইতিমধ্যেই ভালোভাবে কাজ করে তখন সাধারণ লুপগুলি রাখুন।
উৎস
- Universal functions (ufunc) basics — NumPy 2.2NumPy
- The N-dimensional array — NumPy 2.2NumPy
- numpy.vectorize — convenience and performance notesNumPy
- CPU/SIMD optimizations — NumPy 2.2NumPy
- dis — Disassembler for Python bytecodePython Software Foundation
- CPython 3.10.12 list representationCPython contributors
- The limits of Python vectorization as a performance techniqueItamar Turner-Trauring / Python⇒Speed
- Performance TipsNumba
- Basics of CuPyCuPy



