🧑‍💻PythonDev🧑‍💻
365 subscribers
86 photos
3 videos
15 files
78 links
Python tips and tricks
The Good, Bad and the Ugly

📚توی این کانال فقط قرار هست در مورد core python صحبت کنیم.

👨‍💻این کانال یک بلاگ شخصی هست و پیرامون نظرات و چیزهایی که توی این چند سال کد زدن یاد گرفتم (فقط برای کمک به دوستان تازه‌کار)👨‍💻


@Mtio975
Download Telegram
🧑‍💻PythonDev🧑‍💻
https://ocw.sharif.edu/course/id/522
خلاقیت الگوریتمی و برنامه نویسی پایتون
این دوره های که براتون قرار دادم بعضی هاشون دارای تمرین و یادداشت هستند و پاسخ نامه هر تمرین بعد از هر تمرین که حل شده به صورت فایل و به طور کامل و جامع توضیحات داده شده هستند
🧑‍💻PythonDev🧑‍💻
https://www.daneshjooyar.com/learn-algorithm/
الگوریتم و فلوچارت این طوره کاملا رایگان می باشد و دارای گواهی پایان دوره هم می باشد
🧑‍💻PythonDev🧑‍💻
https://quera.org/college/landpage/14471/programming-gateway
دوره دروازه ورود به دنیای برنامه نویسی سایت کوئرا سرفصل های دوره در سایت به طور کامل هستند و دوره دارای مدرک معتبر پایان دوره می باشد
🧑‍💻PythonDev🧑‍💻
https://quera.org/college/landpage/2572/programming-basics-course
دوره مبانی برنامه نویسی و تفکر الگوریتمی کوئرا
توی ادامه بحث profiling اینبار میرسیم به اهمیت حافظه؛ وقتی از یک تازه سنیور شده از پروفایلینگ بپرسید راجب cpu و ... صحبت می‌کنه از یک با تجربه بپرسید اهمیت مصرف حافظه در کنار زمان اجرا رو هم بهتون می‌گه
مثل منم باشید profiling GPU رو هم گذارش میدید (البته به قدرت قبلی‌ها نیست ولی از نداشتنش بهتره)
برای پروفایلینگ مموری معمولا از کتابخونه
memory_profiler
استفاده می‌شه ؛ اما حقیقتا شخصا ۶ ماه هست که جایگزین پیدا کردم و چقدر خوشحالم بابت این موضوع :
memray
که تصویر بالا خروجی اجرای live هست واقعا پروردگار اطلاعات دقیق مصرف مموری هست.
دقت کنید مصرف مموری کتابخونه C, Rust, ... هم که ایمپورت کردید توی پروژه و داره استفاده می‌شه رو نشون میده که خیلی خیلی مهمه.
اما چطور ازش استفاده کنیم ؟
$ pip install memray

همینجا یک موضوع دیگه رو هم بگم (خودتون بخونید) یک پلاگین هم برای pytest داره که می‌توندی بعدا دنبال کنید
pytest-memray
🧑‍💻PythonDev🧑‍💻
توی ادامه بحث profiling اینبار میرسیم به اهمیت حافظه؛ وقتی از یک تازه سنیور شده از پروفایلینگ بپرسید راجب cpu و ... صحبت می‌کنه از یک با تجربه بپرسید اهمیت مصرف حافظه در کنار زمان اجرا رو هم بهتون می‌گه مثل منم باشید profiling GPU رو هم گذارش میدید (البته…
ساده‌ترین راه اجرای memray استفاده از دستور run هست + flamegraph
همونطور که قبلا گفتم خروجی تمام پروفایلینگ‌هارو باید نگه دارید و نمودار لایو اینکار رو نمی‌کنه پس قبل از استفاده از نمودار لایو (حین اجرای برنامه تمام دستورات و مصرف مموری‌هارو نشون میده)
ازین دستورات استفاده کنید :

$ memray run <my-script>.py

بعد از اجرا یک فایل با پسوند bin برای شما ذخیره می‌شه که تمام اطلاعات مورد نیاز داخل همین فایل هست.

memray flamegraph <some-naming>.bin

بعد از اجرای دستور بالا یک فایل html برای شما ایجاد میشه که اگر با مرورگر باز کنید چیزی مشابه تصویر بالا خواهید داشت. تنها نکته‌ای که راجب این تصویر لازمه بگم بخش stats هست که
peak memory usage
(بیشترین مصرف مموری در طول اجرای کد) رو بهتون نشون میده.
باقی موارد به ازای هر خط کد یا import , .... مصرف مموری رو نشون میده (مثال من شاید خیلی خوب نباشه)


پ.ن: همیشه فایل .html رو همراه با .bin روی سیستم خودتون خروجی بگیرید و نگهدارید.
توی پست‌های بعدی می‌گم چرا .
🧑‍💻PythonDev🧑‍💻
ساده‌ترین راه اجرای memray استفاده از دستور run هست + flamegraph همونطور که قبلا گفتم خروجی تمام پروفایلینگ‌هارو باید نگه دارید و نمودار لایو اینکار رو نمی‌کنه پس قبل از استفاده از نمودار لایو (حین اجرای برنامه تمام دستورات و مصرف مموری‌هارو نشون میده) ازین…
دستور run چندتا option هم داره که هرکدوم توی شرایط خاص استفاده می‌شه :

memray run --native <my-script>.py
این حالت برای وقتایی هست که می‌خواید اثبات کنید numpy, pandas , ... هستند که دارند ازین میزان رم استفاده می‌کنند یا اینکه می‌خواهید بین توابع مختلفی که پیکج‌ها ارائه می‌دهند مقایسه انجام بدید.
گرفتن ریپورت html روی این حالت می‌تونه طولانی باشه (جزو حالاتی هست که هم bin هم html بهتره روی یک سیستم خروجی گرفته بشه)

memray run --trace-python-allocators <my-script>.py
بجای گزارشات کلی که توی تغییر سایز memory pool گرفته می‌شه به ازای ایجاد و از بین رفتن هر آبجکت براتون گزارش مموری میده که باز هم خروجی خیلی کندتری خواهد داشت؛ و البته اطلاعات بسیار بیشتر.

memray run --follow-fork <my-script>.py

همونطور که از اسمش پیداس می‌گه اگر از parent process فورک گرفته شد وضعیت مموری اون child process رو هم توی ریپورت بیار.

از بین ۳ تا آپشن بالا توی این مدت شخصا فقط از native استفاده کردم چندبار (باقی موارد رو نیاز نداشتم)

اما دوتا آپشن دوست داشتنی دیگه هم وجود داره :
memray run --live <my-script>.py

همیشه بعد از اینکه دستور run رو اجرا کردم (ذخیره بشه) و بعد گزارش html رو آماده کردم؛ تا وقتی دارم روی memory optimization کار می‌کنم تنها دائما از live option استفاده می‌کنم

PID, Thread, Samples, Duration, Max heap size, current heap size
و ... رو بهم میده (برای current heap size) چون توی حالت لایو سریع تغییر می‌کنه از

time.sleep(10)
استفاده می‌کنم توی جایی که مشکوک هستم به میزان مصرف مموری و اینجوری ی پنجره ۱۰ ثانیه‌ای برای خودم باز می‌کنم تا دقیق بررسی کنم توی رم چه اتفاقی داره رخ میده.

memray run --live-remote <my-script>.py
هم همین کار رو می‌کنه اما گزارشات رو روی یک port خاص میفرسته (بازم من ازش استفاده نکردم)

memray run --live --native <my-script>.py
پر استفاده‌ترین حالت بعد از live option برای من استفاده ترکیبی از live و native هست (البته که حوصله آدم سر میره بعضی وقت‌ها تا گزارشش آماده بشه)

حتما برای کاستومایز کردن خروجی‌ها و بررسی دقیق‌تر داکیومنتش رو نگاه کنید (سعی کردم مهمترین مواردی که شخصا استفاده می‌کنم رو بگم فقط).
توی این هفته ۴ بار، یک سوال مصاحبه قدیمی رو در موردش صحبت پیش اومده؛
داستان چیه، من چندین سال پیش با یک شرکت مصاحبه داشتم و مصاحبه کننده ازم یک سوال
Data structure & Algorithm
پرسید، من سوال رو خیلی سریع توضیح دادم و بعد خیلی سریع هم پاسخ صحیح رو نوشتم، در نهایت از تعجب مصاحبه کننده شک کردم که اشتباهی شده و توضیح دادم که من سطح جونیور نیستم و ... (اشتباه سمت HR بود، چون توی جلسه اول هم پیش اومده بود)
طرف ازم خواست که سوال دیگری رو مطرح کنه و دیدم داره طول می‌کشه روی همون سوال قبلی بهش یک پیشنهادی دادم که واقعاً خودمم تا اون لحظه کار نکرده بودم و برام جذاب بود چالش قضیه
در نهایت ایشون هم قبول کرد و رفتیم سراغ مسئله (کل جلسه همین سوال طول کشید و درنهایت هم من قبول شدم)

توی این هفته (شایدم ۲ هفته)، یکبار بعنوان مصاحبه کننده، دوبار دوستانه و یکبار هم راهنمایی بعد از مصاحبه برای یکی از دوستان بحث سوال مطرح شد :

همین‌جا بگم، هیچکس جواب درست حالت سخت‌تر رو نداد.

۱- سوال اصلی مصاحبه خودم :
با استفاده از ساختار داده لیست؛ یک کلاس stack پیاده سازی کنید که یک عدد ورودی به اسم n بگیره و به تعداد n استک ایجاد کنه بطوری که دیتای تمام این استک‌ها داخل فقط و فقط ۱ لیست ذخیره بشه.

سوال خیلی ساده‌اس اما دوتا پرسش داره :
۱- آیا طول لیست از پیش تعریف شده هست؟ (که قطعاً میگن بله)

۲- آیا طول stack ها باهم برابر هست ؟ (جواب اینم بله هست)

که خب شما لیست رو به n قسمت تقسیم می‌کنید و هر قسمت رو به یک استک می‌دید.


نسخه‌ای که من به ذهنم رسید (خودمم توی مصاحبه‌هام می‌پرسم) :
۱- فرض کنید طول لیست از قبل مشخص نیست و stack ها می‌تونند تا بی‌نهایت ادامه داشته باشند (فرض کنید رم بی‌نهایت داریم)

دوتا راهکاری که به ذهن خودم رسید و هنوز توی این چندسال راه دیگه‌ای بهم نگفتند :
۱- هر عنصر لیست، یک tuple باشه که ایندکس اول tuple اندیس stack باشه و ایندکس دوم، داده‌ایی که ذخیره شده

اما بازم سختش کنیم، شما غیر از نوع داده‌های اصلی :
int, float, decimal, ...
چیزی نمی‌تونید داخل stack نگه دارید (یعنی فقط دیتا)

راهنمای کوچیک راهکار دوم : از  Remainder  طول فعلی لیست بر‌ n استفاده کنید و ببینید کدوم اندیس برای کدوم stack هست.

بحث سر راهکار من روی آخرین حالت سوال (که خب سوال مصاحبه یکی از دوستان هم بوده، کاملاً اتفاقی) من رو به اینجا رسوند که این موارد مثل جلسه امشب رو یک کاری باهاش بکنیم،

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

اسپانسر : چندباری پیش اومده، اما نهایتاً هدفشون یا تبلیغ برای فروش دیگر محصولات آموزشی هست، یا اینکه میخوان یک بخشی رایگان باشه و باقی بفروش برسه و ...
خلاصه درآمدی (پول خوبی هم داره)

لایو : که خب محدودیت ۱۰۰ نفر و زمان و ... داریم و خیلی‌ها فرصت نمی‌کنند شرکت کنند و چون ذخیره هم نمیشه خیلی چیز قشنگی نمیشه نهایتاً

متن و کانال : برای آموزش‌های این چنینی واقعاً خوب نیست و خیلی خیلی سخت هست

یوتیوب : مزایایی که داره اینه که شما با دیدن؛ کامنت؛ لایک انگار دارید دوره رو می‌خرید و پشتیبانی مالی می‌کنید.
معایب : زمان زیادی می‌گیره - من واقعاً بلد کار نیستم - subscribe,like,comment نداشته باشه انگیزه خیلی پایین میاد - درآمدی نداره (حداقل اوایل کار) - درصورت عدم حمایت برندسازی خودم خراب می‌شه - از همه بدتر با توجه به اوضاع اینترنت ایران می‌ترسم خیلی دوستان نتونند روی یوتیوب تماشا کنند و همه موارد قبلی اتفاق بیوفته

اما خیلی دوست دارم یک راهکاری پیدا کنم که حداقل میزانی که خودم بلد هستم مطالب مورد نیاز رو منتقل کنم به دوستان.

همچنان به دنبال راهکار
🧑‍💻PythonDev🧑‍💻
توی این هفته ۴ بار، یک سوال مصاحبه قدیمی رو در موردش صحبت پیش اومده؛ داستان چیه، من چندین سال پیش با یک شرکت مصاحبه داشتم و مصاحبه کننده ازم یک سوال Data structure & Algorithm پرسید، من سوال رو خیلی سریع توضیح دادم و بعد خیلی سریع هم پاسخ صحیح رو نوشتم،…
پیشنهاد، انگلیسی بودن ویدئوها بیشترین پیشنهاد بود
ولی نه ممنون،
منبع انگلیسی به وفور پیدا می‌شه با آدم‌هایی که فن بیان و تجربه تدریس بسیار بسیار بیشتری از من دارند.

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

پ.ن :
یوتیوب رو هنوز خیلی روش نیستم البته
خیلی دوس داشتم ی جای بزرگی داشتم، همه بچه‌ها رو جمع میکردم اونجا و همونجا دور هم تمرین می‌کردیم (طوریکه کرایه اتوبوس تا تهران رو هم حتی خودم میدادم)
اینجوری مطمئن بودم هرکسی علاقه داره حتماً می‌تونه یاد بگیره (اینترنت و ... محدودیتش نیست)

پیشنهاد پلتفرم پولی به من ندید، ممنون ♥️
✔️ استیبل بودن یا نبودن یک الگوریتم مرتب سازی

یکی از دسته بندی های موجود برای الگوریتم هایsort کردن، فاکتور stable بودن یا نبودن هست. به طور خلاصه به الگوریتمی میگن stable که:

موقع sort کردن یک لیست، اگه ۲ تا آیتم مساوی هم بودن، دقیقا به همون ترتیبی که توی لیست اولیه بودن، توی لیست مرتب شده هم ظاهر بشن.

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

lst = [
("Ashkan",17),
("Bahar",18),
("Sorena",17)
]
یک راه مرسوم اینه که به این روش sort رو انجام بدیم:
lst.sort(key=lambda x: (x[1], x[0]))
کاملا درسته و هیچ اشکالی نداره. بیشتر میخواستیم درباره موضوع پست صحبت کنیم.

آیا میتونیم فقط بیایم بر اساس آیتم دوم sort ش کنیم؟ این که خود لیست بر اساس حروف الفبا مرتب شده آیا کمکی میکنه؟ یعنی:
lst.sort(key=lambda x: x[1])
اگه بدونیم الگوریتمی که استفاده شده stable هست بله میتونیم و گارانتی هست که آیتم های مساوی به همون ترتیب در خروجی قرار میگیرن، و چون در حال حاضر بر اساس حروف الفبا مرتب شده هستن، اون افرادی که نمره ی برابر دارن اتوماتیک بر اساس حروف الفبا هم مرتب هستن.

خروجی هردو:
[
('Ashkan', 17),
('Sorena', 17),
('Bahar', 18)
]
پایتون از Tim Sort استفاده میکنه و stable هست.


چند تا از الگوریتم های مرتب سازی استیبل:
• Insertion Sort
• Merge Sort
• Bubble Sort
• Tim Sort
و نقطه‌ی مقابلشون:
• Heap Sort
• Selection Sort
• Quick Sort
#Roadmap 2023

این پیام توی چندروز آینده، آپدیت میشه

اینبار با فرض اینکه مقدمات پایتون رو می‌دونید شروع می‌کنم، توی ایران شاید حتی باید بگم با فرض اینکه پایتون رو در سطح Senior بلد هستید (بدون تعارف ۹۸٪ ایرانی‌هایی که توی لینکدین میزنن
Senior Python Developer
واقعاً سطح‌‌اشون این نیست)

مهمتر اینکه، من این RoadMap رو برای پیدا کردن شغل نوشتم؛ گوشه ذهنم ML Engineering رو هم دارم، نه Researcher حرفه‌ای شدن؛ البته که ی سطحی از این موارد رو بدونید.

۱- اول باید پایتون رو حرفه‌ای باشید، بدون تعارف مرحله دوم مصاحبه حرفه‌ای شما ارزیابی زبان برنامه‌نویسی هست که اعلام کردید و سطحی که گفتید و مهم‌تر از اون
Data structure & Algorithm

پس اولین کتابی که ۱۰۰٪ باید بخونید
Fluent Python 2nd Edition
و بعد از اون :
Data Structure & Algorithm in Python

این موارد که تموم شد، بخش زیادی از مرحله اول و دوم مصاحبه رو با موفقیت جلو می‌برید، غیر از سوالات هوش مصنوعی (البته تمام مراحل به soft skills ها هم بستگی داره)

بعد از این باید بتونید، دیتا رو اصطلاحاً مثل موم توی دست بگیرید پس برای دیتای tabular لازمه که
Pandas
رو بدونید اما توی همین راستا :
Numpy, Matplotlib
کتابی که برای نامپای معرفی میکنم برای سال ۲۰۱۷ هست قدیمی شاید باشه اما بسیار بسیار عالی و فوق العاده هست (خیلی دنبالش گشتم توی این سالها امروز اتفاقی پیداش کردم)

From Python to Numpy

هم لازمه ولی نرید بشینید کل توابع رو حفظ، چون به لطف گوگل همرو پیدا می‌کنید چیزی که خیلی حرفه‌ای باید بدونید، سرعت بخشیدن به کد‌ها هست
توی نامپای بهتره فرق numpy معمول و mkl و ... رو بدونید (ml engineer)

Array programming, vectorization

رو بدونید، for loop رو حذف کردن و بجاش از np.vectorize گذاشتن اسمش

Vectorization
نیست.
برای matplotlib هم باید بتونید باهاش storytelling انجام بدید، کاربر عادی باید بتونه با کمترین توضیح شما هدف نمودار و ... ایی که نمایش دادید رو متوجه بشه.


آپدیت‌های این پست وقتی تموم می‌شه که
Pin
بشه روی کانال
🧑‍💻PythonDev🧑‍💻 pinned «#Roadmap 2023 این پیام توی چندروز آینده، آپدیت میشه اینبار با فرض اینکه مقدمات پایتون رو می‌دونید شروع می‌کنم، توی ایران شاید حتی باید بگم با فرض اینکه پایتون رو در سطح Senior بلد هستید (بدون تعارف ۹۸٪ ایرانی‌هایی که توی لینکدین میزنن Senior Python Developer…»