Ali sharifi
خواندن ۳ دقیقه·۳ ماه پیش

چطوری کدمو سریع‌تر کنم؟!

اگر قرار باشه یک کد کاربرهای زیادی داشته باشه و موارد استفاده‌ش زیاد باشه، لازمه که بتونه به سرعت اجرا شه. اگر که شما هم کد پایتونی دارید که نیازمندی‌های شما رو از لحاظ زمان اجرا برطرف نمی‌کنه و می‌خواید که عملکردش رو بهبود بدید، این نوشته می‌تونه به شما کمک کنه.


از کجا شروع کنم؟!

برای شروع باید متوجه بشید که کدوم قسمت کد بخش عمده زمان اجرای شما رو می‌گیره. در زبان پایتون، ابزارهایی برای profile کردن کدها توسعه‌داده‌شده. یکی از این ابزارها، line profiler هست که اطلاعات خوبی درباره زمان اجرای هر قسمت از کدتون بهتون میده. نحوه کارکرد این کتابخونه به این شکل هست که توابعی که میخواید عملکردشون رو بسنجید رو با profile@ باید annotate کنید و در زمان اجرا متغیر محلی LINE_PROFILE رو با مقدار ۱ تنظیم کنید و کدتون رو اجرا کنید. خروجی این اجرا به صورت یک فایل خواهد بود که توی اون درباره خط به خط توابع مشخص شده، تعداد دفعاتی که اون خط اجرا شده، کل زمانی که اجرا شده، میانگین زمان هر بار اجرا، و درصد زمانی که اون خط به خودش تخصیص‌داده رو نشون میده و به شما کمک می‌کنه که گلوگاه کد رو پیدا کنید.

حالا که پیداش کردیم، چیکارش کنم؟!

راه‌های مختلفی برای بهبود عملکرد یک کد وجود داره. یک راه اینه که به دنبال الگوریتم‌های بهینه‌تری برای حل مساله‌تون بگردید. الگوریتم‌ها بزرگترین نقش رو در عملکرد یک سیستم دارن. اگر نقطه بهبودی در الگوریتم پیدا نکردید، می‌تونید به استفاده از داده‌ساختارهای دیگه فکر کنید. به عنوان مثال، اگر که به صورت مستمر عضویت یک شی رو در یک collection چک می‌کنید، استفاده از set بهینه‌تر از استفاده از list هست.

یک راه دیگه‌ای که می‌تونه خیلی بهتون کمک کنه، array programming هست. خوبه که بدونید که اشیا پایتون، حتی primitive typeها به شکل غیر بهینه‌ای ذخیره می‌شن و پایتون برای هر کدومشون در سطح پایین یک struct نگهداری می‌کنه که شامل نوع، مقدار، و سایر اطلاعات اونا میشه. اگر که شما در کدتون، دوتا عدد طبیعی رو با هم جمع کنید، پایتون اول چک می‌کنه که نوع این دو شی، عدد باشه و جمع بینشون تعریف شده باشه و بعد جمع رو انجام میده و نتیجه رو بر میگردونه. همه این اتفاقات در زبان‌هایی که type checking دارن میتونن انجام نشن و سرعت خیلی بیشتری داشته باشید. جالبه که بدونید بعضی از کتابخونه‌هایی که در محاسبات استفاده میشن، مثل Numpy و Pandas و ...، به زبان C نوشته شدن و سرعت انجام محاسبات در اون ها بسیار بالاس. این کتابخونه‌ها می‌تونن عملیات‌های برداری رو به خوبی و با عملکرد بالا پشتیبانی کنن. بنابرین توصیه می‌کنم در صورتی که منطق ساده مبتنی بر محاسبات زیاد دارید این کتابخونه‌ها رو فراموش نکنید.

راه‌حل‌های مختلف رو چطوری مقایسه کنم؟

اگر که بخواید راهکارهای مختلفی رو برای بهبود بخشی از کد مقایسه کنید، می‌تونید از ابزار timeit در پایتون استفاده کنید. این ابزار یک تکه کد رو به تعدادی بار (که شما توانایی تنظیم آن را دارید) اجرا می‌کند و میانگین زمان اجرا و انحراف معیار را به شما میده و شما رو قادر می‌کنه که بتونید عملکرد راهکارهای مختلف رو مقایسه کنید.

جمع‌بندی

برای بهبود عملکرد کد خیلی مهمه که به صورت کور عمل نکنید و حواستون رو متوجه قسمت درست کنید. همه موارد فوق به شما کمک می‌کنن که بتونید کد سریع‌تری داشته باشید. واضحه که این موارد، جامع نیستن و بسته به کاربرد و شرایط می‌تونید از راهکارهای دیگه‌ای استفاده کنید. برای اطلاعات بیشتر از این ابزارها و راهکارها، می‌تونید به مستنداتشون که در زیر اومده مراجعه کنید.


https://github.com/pyutils/line_profiler

https://docs.python.org/3/library/timeit.html

https://pandas.pydata.org/

https://numpy.org/


بسم الله الرحمن الرحیم علی شریفی هستم؛ دانشجوی مهندسی کامپیوتر دانشگاه صنعتی شریف!
شاید از این پست‌ها خوشتان بیاید