با استفاده از multiprocessing.Pool یک برنامه بنویسید که یک لیست بزرگ از اعداد صحیح را به صورت موازی پردازش کند و برای هر عدد تعیین کند آیا اول است یا خیر و در نهایت تعداد اعداد اول را برگرداند.
19.0 بازدید آخرین ویرایش در 198 روز قبل ساعت 03:11 0.0
برای حل این مسئله از ماژول multiprocessing و بهخصوص کلاس Pool استفاده کنید: تابعی برای آزمون اول بودن عدد بنویسید و سپس با Pool.map یا imap_unordered آن را به صورت موازی روی لیست ورودی اعمال کنید؛ نتیجهها را با sum جمع بزنید تا تعداد اعداد اول بهدست آید. نکات مهم: از if __name__ == '__main__' استفاده کنید تا مشکل راهاندازی پردازشها در ویندوز پیش نیاید، میتوانید cpu_count را برای تعیین تعداد پروسسها بهکار برید و با پارامتر chunksize کارایی را بهبود دهید؛ از متغیرهای سراسری قابل نوشتن خودداری کنید. این تمرین نشان میدهد چگونه با تقسیم کار بین هستهها کارهای محاسباتی (مفید در HPC) را سرعت ببخشید و برای سناریوهای با نیاز پاسخدهی سریع در سیستمهای بلادرنگ مناسبسازی کنید.
1 پاسخ
جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من
در حال بارگیری...
برای ارسال پاسخ باید با حساب کاربری وارد شوید.
ورود به حساب کاربری
برای مسائل پرهزینه CPU مانند تشخیص اول بودن اعداد با لیست بزرگ، multiprocessing.Pool و map/imap_unordered مفید هستند اما بهدلیل هزینه فراخوانی فرایند و پیکلینگ برای وظایف بسیار کوچک ممکن است سودی نداشته باشند. اگر دامنه اعداد خیلی وسیع است بهتر است ابتدا روشهای الگوریتمی مثل غربال اراتوستن (یا غربال قطعهای) را در نظر بگیرید و سپس پردازش موازی را روی بخشهای بزرگتر اعمال کنید. حتماً از if __name__ == '__main__' در ویندوز استفاده کنید، cpu_count برای تعیین تعداد پروسسها و تنظیم chunksize برای کاهش سربار توصیه میشود. از متغیرهای سراسری قابل نوشتن بپرهیزید و در صورت نیاز نتایج را با imap_unordered برای پاسخدهی سریعتر جمعآوری کنید.
گزارش