🧑💻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 رو هم گذارش میدید (البته…
سادهترین راه اجرای
ازین دستورات استفاده کنید :
peak memory usage
(بیشترین مصرف مموری در طول اجرای کد) رو بهتون نشون میده.
باقی موارد به ازای هر خط کد یا
پ.ن: همیشه فایل
توی پستهای بعدی میگم چرا .
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 نداشته باشه انگیزه خیلی پایین میاد - درآمدی نداره (حداقل اوایل کار) - درصورت عدم حمایت برندسازی خودم خراب میشه - از همه بدتر با توجه به اوضاع اینترنت ایران میترسم خیلی دوستان نتونند روی یوتیوب تماشا کنند و همه موارد قبلی اتفاق بیوفته
اما خیلی دوست دارم یک راهکاری پیدا کنم که حداقل میزانی که خودم بلد هستم مطالب مورد نیاز رو منتقل کنم به دوستان.
همچنان به دنبال راهکار
داستان چیه، من چندین سال پیش با یک شرکت مصاحبه داشتم و مصاحبه کننده ازم یک سوال
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
یکی از دسته بندی های موجود برای الگوریتم های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 رو برای پیدا کردن شغل نوشتم؛ گوشه ذهنم
۱- اول باید پایتون رو حرفهای باشید، بدون تعارف مرحله دوم مصاحبه حرفهای شما ارزیابی زبان برنامهنویسی هست که اعلام کردید و سطحی که گفتید و مهمتر از اون
Data structure & Algorithm
پس اولین کتابی که ۱۰۰٪ باید بخونید
Fluent Python 2nd Edition
و بعد از اون :
Data Structure & Algorithm in Python
این موارد که تموم شد، بخش زیادی از مرحله اول و دوم مصاحبه رو با موفقیت جلو میبرید، غیر از سوالات هوش مصنوعی (البته تمام مراحل به soft skills ها هم بستگی داره)
بعد از این باید بتونید، دیتا رو اصطلاحاً مثل موم توی دست بگیرید پس برای دیتای
رو بدونید اما توی همین راستا :
هم لازمه ولی نرید بشینید کل توابع رو حفظ، چون به لطف گوگل همرو پیدا میکنید چیزی که خیلی حرفهای باید بدونید، سرعت بخشیدن به کدها هست
توی نامپای بهتره فرق
رو بدونید،
نیست.
برای
آپدیتهای این پست وقتی تموم میشه که
Pin
بشه روی کانال
این پیام توی چندروز آینده، آپدیت میشه
اینبار با فرض اینکه مقدمات پایتون رو میدونید شروع میکنم، توی ایران شاید حتی باید بگم با فرض اینکه پایتون رو در سطح 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…»
Snap.png
1.6 MB
Let's dig in a bit :) 🐕
سه حالت برای کش وجود داره,
در حالت اول، هیچ کشی انجام نمیشه و تنها آمار کلی از تعداد بارهایی که تابع فراخوانی شده ثبت میشه.
در حالت دوم، کش سادهای بدون محدودیت سایز وجود دارد. در این حالت، نتیجهی تابع برای ورودیهای مشابه ذخیره شده و برای بارهای بعدی فراخوانی میشود.
در حالت سوم، سایز کش محدود شده است. در این حالت، نتایج قدیمیتر ترک میشوند و به جای آنها، نتایج جدیدی که اخیرا استفاده شدهاند، ذخیره میشوند. پس وقتی maxsize پر شد بهتون ارور نمیده :)). جالبه نه؟
سه حالت برای کش وجود داره,
در حالت اول، هیچ کشی انجام نمیشه و تنها آمار کلی از تعداد بارهایی که تابع فراخوانی شده ثبت میشه.
در حالت دوم، کش سادهای بدون محدودیت سایز وجود دارد. در این حالت، نتیجهی تابع برای ورودیهای مشابه ذخیره شده و برای بارهای بعدی فراخوانی میشود.
در حالت سوم، سایز کش محدود شده است. در این حالت، نتایج قدیمیتر ترک میشوند و به جای آنها، نتایج جدیدی که اخیرا استفاده شدهاند، ذخیره میشوند. پس وقتی maxsize پر شد بهتون ارور نمیده :)). جالبه نه؟
من همیشه به یک چیزی اعتقاد دارم و آن، دید مهندسی است. از خصوصیات مفید و بزرگ دانشگاه خوب رفتنم، همین دید مهندسی است.
حالا این دید مهندسی یعنی چی؟
یعنی شما وقتی بدونید memory management چیست و GC چه کاری تو پایتون انجام میدهد، باعث میشود کدی که مینویسید، memory friendlyتر باشد.
یا وقتی SQL بلدید و PostgreSQL هم بلدید، باعث میشود خیلی وقتا query بنویسید که به جای ۳ بار هیت، یک هیت به دیتابیس بزند. out of box ترش این است که اگر query که میزنید، read هست، چند تا read replication بسازید و horizentonal scaling انجام دهید تا سرعت query بهتر شود. اگر میبینید query که میزنید، مثلاً ۱۰ درصد ریزالت کل دیتابیستون است و حجیم است، از طرفی مثلاً ۲ تا column خیلی استفاده میشود توی آن query، آن وقت میتوانید ترکیب آن دو تا column را ایندکس کنید تا پرفورمنس بهتری بگیرید. اما اگر ریزالت برگشتی ۷۰ درصد دیتابیستون باشد، آن موقع ایندکسها سربار دیتابیستون میشوند و نه تنها کمک نمیکنند بلکه سرعت شما را هم کاهش میدهند.
به این میگویند دید مهندسی. یعنی بدانید از چه چیزی کجا و به چه اندازهای استفاده کنید.
همه اینها را گفتم تا برسم به این کتاب:
https://www.amazon.com/Designing-Data-Intensive-Applications-Reliable-Maintainable/dp/1449373321
این کتاب به شما یک دید مهندسی فوقالعاده میدهد. تازه شروع کردم و میتونم بگم محشره ✌️
حالا این دید مهندسی یعنی چی؟
یعنی شما وقتی بدونید memory management چیست و GC چه کاری تو پایتون انجام میدهد، باعث میشود کدی که مینویسید، memory friendlyتر باشد.
یا وقتی SQL بلدید و PostgreSQL هم بلدید، باعث میشود خیلی وقتا query بنویسید که به جای ۳ بار هیت، یک هیت به دیتابیس بزند. out of box ترش این است که اگر query که میزنید، read هست، چند تا read replication بسازید و horizentonal scaling انجام دهید تا سرعت query بهتر شود. اگر میبینید query که میزنید، مثلاً ۱۰ درصد ریزالت کل دیتابیستون است و حجیم است، از طرفی مثلاً ۲ تا column خیلی استفاده میشود توی آن query، آن وقت میتوانید ترکیب آن دو تا column را ایندکس کنید تا پرفورمنس بهتری بگیرید. اما اگر ریزالت برگشتی ۷۰ درصد دیتابیستون باشد، آن موقع ایندکسها سربار دیتابیستون میشوند و نه تنها کمک نمیکنند بلکه سرعت شما را هم کاهش میدهند.
به این میگویند دید مهندسی. یعنی بدانید از چه چیزی کجا و به چه اندازهای استفاده کنید.
همه اینها را گفتم تا برسم به این کتاب:
https://www.amazon.com/Designing-Data-Intensive-Applications-Reliable-Maintainable/dp/1449373321
این کتاب به شما یک دید مهندسی فوقالعاده میدهد. تازه شروع کردم و میتونم بگم محشره ✌️
اینو هرچی بیشتر دیباگ میکنم I’m دارک تر میشه:)) امروز با یکی از دوستان داشتیم دیباگش میکردیم که متوجه شدیم وقتی از asyncio.get_event_loop تو ویندوز استفاده میکنید یک پورت باز میکنه و این اصلا ربطی به undetected نداشت.
حالا اینکه چرا پورت باز میشه نمیدونم ولی این تو windows_event.py هست تو پایتون, و تو ویندوز اتفاق میفته.
نکته جالب اینجاست که gc وقتی آبجکتی رو کالکت میکنه که احساس میکنه نیاز به کالکت شدن داره, و برای port exhaustion تعریف نشده. پس حتی متود
خلاصه اگه از asyncio.get_event_loop رو ویندوز استفاده میکنید حواستون به این نکته باشه که حتما باید close بخوره وگرنه هم مموری لیک خواهید داشت و هم port exhaustion.
سعی کردم PR بزنم به پایتون, اول فکر کردم مشکل از asyncio هست ولی ظاهرا مشکل از gc هست و gc خیلی پیچیده تر و ادونس تر از سطح منه که بخوام PR بزنم و این مشکلو برطرف کنم. بنابراین issue میزنم 😁
حالا اینکه چرا پورت باز میشه نمیدونم ولی این تو windows_event.py هست تو پایتون, و تو ویندوز اتفاق میفته.
نکته جالب اینجاست که gc وقتی آبجکتی رو کالکت میکنه که احساس میکنه نیاز به کالکت شدن داره, و برای port exhaustion تعریف نشده. پس حتی متود
__del__
که خودشون نوشتن هیچوقت صدا زده نمیشه, به جز زمانی که اسکریپت متوقف میشه.خلاصه اگه از asyncio.get_event_loop رو ویندوز استفاده میکنید حواستون به این نکته باشه که حتما باید close بخوره وگرنه هم مموری لیک خواهید داشت و هم port exhaustion.
سعی کردم PR بزنم به پایتون, اول فکر کردم مشکل از asyncio هست ولی ظاهرا مشکل از gc هست و gc خیلی پیچیده تر و ادونس تر از سطح منه که بخوام PR بزنم و این مشکلو برطرف کنم. بنابراین issue میزنم 😁
🧑💻PythonDev🧑💻
اینو هرچی بیشتر دیباگ میکنم I’m دارک تر میشه:)) امروز با یکی از دوستان داشتیم دیباگش میکردیم که متوجه شدیم وقتی از asyncio.get_event_loop تو ویندوز استفاده میکنید یک پورت باز میکنه و این اصلا ربطی به undetected نداشت. حالا اینکه چرا پورت باز میشه نمیدونم…
میتونید از این کد نمونه برا تست استفاده کنید :
import asyncio
import psutil
import os
import gc
def check_connections():
"""Check count of ESTABLISHED connections."""
return len([
conn for conn in psutil.net_connections()
if conn.status == 'ESTABLISHED' and conn.pid == os.getpid()
])
loop = asyncio.get_event_loop()
print(check_connections()) #2
loop = None # or del loop
gc.collect()
print(check_connections()) #2
یک چیز خیلی جالب متوجه شدم. درواقع وقتی تو پایتون میگیم Optional یعنی required 😅😅 اما None هم میگیره.
پایدنتیکمو آپدیت کردم پروژم به ارور میخورد
کدم اینطوری بود
پایدنتیکمو آپدیت کردم پروژم به ارور میخورد
کدم اینطوری بود
class LinkedinData(BaseModel):جالبه, آپشنال required هست ولی میتونه none باشه. پس آپشنالی که درواقع باید آپشنال باشه آپشنال نیست 😂😂
ads_id: Optional[str]
obj = LinkedinData() # Error
obj = LinkedinData(ads_id=None) # No Error
خلاصه
مواردی که به نظر من یک بک اند کار برای کار تو شرکت های مدرن خارجی و گرفتن جاب آفر داخلشون باید بلد باشه, طبق تجربه این چند وقتم داخل مصاحبه ها و جاب هایی که دیدم:
1. آشنایی با گیت
2. تست نویسی
3. آشنایی با github action برای نوشتن فایل work flow yaml
4. درک عمیق تر از پایتون (خوندن کتابی مثل fluent python یا python cook book)
تسلط به پترن دیزاین ها
5. آشنایی با paradigms های مختلف برنامه نویسی
6. الگوریتم
7. تسلط روی SQL
8. آشنایی با MySQL یا PostgreSQL.
9. آشنایی با داکر و داکر کامپوز
10. آشنایی با مفاهیم Event driven architecture, SOA, microservice و Monolithic
11. تسلط رو یک فریم ورک microservice friendly مثل FastAPI یا Flask
12. آشنایی با یک فریم ورک Monolithic مثل جنگو میتونه مزیت خوبی باشه.
13. آشنایی با یک سرویس کلاد (AWS/Azure/GCP) در حد نیاز بک اند. معمولا certificate های مشخصی دارن که میتونید راجبشون تحقیق کنید و تو اون مسیری که مربوط به بک اند دولوپر میشه برین.
14. آشنایی با دیتابیس های کلاد مثل amazon rds
15. آشنایی با serverless و نمونش داخل کلاد مثل AWS Lambda
16. آشنایی با k8s در حد نوشتن فایل yaml سرویستون
17. آشنایی با یک ابزار IAC مثل terraform
(از بین ترافورم یا k8s و داکر, معمولا رو یکیش تمرکز میکنن شرکتا. و تو اغلب آگهی ها هم دیدم وزن بیشتر سمت داکر و k8s بوده تا ترافورم)
1. آشنایی با گیت
2. تست نویسی
3. آشنایی با github action برای نوشتن فایل work flow yaml
4. درک عمیق تر از پایتون (خوندن کتابی مثل fluent python یا python cook book)
تسلط به پترن دیزاین ها
5. آشنایی با paradigms های مختلف برنامه نویسی
6. الگوریتم
7. تسلط روی SQL
8. آشنایی با MySQL یا PostgreSQL.
9. آشنایی با داکر و داکر کامپوز
10. آشنایی با مفاهیم Event driven architecture, SOA, microservice و Monolithic
11. تسلط رو یک فریم ورک microservice friendly مثل FastAPI یا Flask
12. آشنایی با یک فریم ورک Monolithic مثل جنگو میتونه مزیت خوبی باشه.
13. آشنایی با یک سرویس کلاد (AWS/Azure/GCP) در حد نیاز بک اند. معمولا certificate های مشخصی دارن که میتونید راجبشون تحقیق کنید و تو اون مسیری که مربوط به بک اند دولوپر میشه برین.
14. آشنایی با دیتابیس های کلاد مثل amazon rds
15. آشنایی با serverless و نمونش داخل کلاد مثل AWS Lambda
16. آشنایی با k8s در حد نوشتن فایل yaml سرویستون
17. آشنایی با یک ابزار IAC مثل terraform
(از بین ترافورم یا k8s و داکر, معمولا رو یکیش تمرکز میکنن شرکتا. و تو اغلب آگهی ها هم دیدم وزن بیشتر سمت داکر و k8s بوده تا ترافورم)
🧑💻PythonDev🧑💻 pinned «مواردی که به نظر من یک بک اند کار برای کار تو شرکت های مدرن خارجی و گرفتن جاب آفر داخلشون باید بلد باشه, طبق تجربه این چند وقتم داخل مصاحبه ها و جاب هایی که دیدم: 1. آشنایی با گیت 2. تست نویسی 3. آشنایی با github action برای نوشتن فایل work flow yaml 4.…»
خب دوستان فصل هایی که قراره شروع کنیم برای پایتون مقدماتی به شرح ذیل است :
فصل اول : آشنایی با برنامه نویسی
پایتون
شامل :
تاریخچه پایتون
1.نصب پایتون 2.variables-expression-statements
3.Boolean
4.دستورات شرطی پایتون - if else
5.نوشتن برنامه در فایل
6. تفاوت پایتون دو و سه
فصل دوم : حلقه های تکرار و تابع در پایتون
شامل :
1.کار با توابع پایتون - functions
2.حلقه های تکرار در پایتون - while
3.حلقه تکرار for در پایتون
4.بازی حدس عدد
فصل سوم : ساختارهای داده در پایتون
شامل :
1.کار با رشته ها در پایتون(strings)
2.کار با لیست ها(lists)
فصل چهارم : کتابخانه ها در پایتون
شامل :
1.کتابخانه های استاندارد پایتون
2.جست و جو در کتابخانه های دیگر پایتون
فصل پنجم : کار با فایل های اکسل در پایتون
شامل :
2.فایل های csv در پایتون
سعی میکنم این اموزش ها رو تو یه هفته براتون به صورت کامل توضیح بدم دوستانی که موافق هستن تایید کنن تا من با جزئیات کامل براشون اموزش ها رو کامل کنم
فصل اول : آشنایی با برنامه نویسی
پایتون
شامل :
تاریخچه پایتون
1.نصب پایتون 2.variables-expression-statements
3.Boolean
4.دستورات شرطی پایتون - if else
5.نوشتن برنامه در فایل
6. تفاوت پایتون دو و سه
فصل دوم : حلقه های تکرار و تابع در پایتون
شامل :
1.کار با توابع پایتون - functions
2.حلقه های تکرار در پایتون - while
3.حلقه تکرار for در پایتون
4.بازی حدس عدد
فصل سوم : ساختارهای داده در پایتون
شامل :
1.کار با رشته ها در پایتون(strings)
2.کار با لیست ها(lists)
فصل چهارم : کتابخانه ها در پایتون
شامل :
1.کتابخانه های استاندارد پایتون
2.جست و جو در کتابخانه های دیگر پایتون
فصل پنجم : کار با فایل های اکسل در پایتون
شامل :
2.فایل های csv در پایتون
سعی میکنم این اموزش ها رو تو یه هفته براتون به صورت کامل توضیح بدم دوستانی که موافق هستن تایید کنن تا من با جزئیات کامل براشون اموزش ها رو کامل کنم