🙋معرفی 25 دوره رایگان مقدماتی برای کسانی که قصد دارند در حوزه های زیر شروع به یادگیری کنن:
- Web Development
- Data Science
- DevOps
🌻🚀با توجه به فیدبک های ارزشمندی که در این چند روز دریافت کردم، در ادامه این پست 25 دوره مقدماتی رو خدمت شما عزیزان معرفی شده که امیدوارم مفید و سودمند باشند.
تقدیم نگاه شما عزیزان:
❯ HTML and CSS
freecodecamp.org/learn/2022/res…
❯ JavaScript
scrimba.com/learn/learnjav…
❯ Python
cs50.harvard.edu/python/2022/
❯ SQL
online.stanford.edu/courses/soe-yd…
❯ Java
scaler.com/topics/course/…
❯ C#
dotnet.microsoft.com/en-us/learn/cs…
❯ C
alison.com/course/diploma…
❯ C++
alison.com/course/c-plus-…
❯ React
scrimba.com/learn/learnrea…
❯ Linux
cybrary.it/instructor/cor…
❯ Docker
cognitiveclass.ai/courses/docker…
❯ Kubernetes
simplilearn.com/learn-kubernet…
❯ DevOps ( احتمالا بعضی بخش ها غیر رایگان )
openclassrooms.com/en/courses/785…
❯ CI/CD
simplilearn.com/free-ci-cd-onl…
❯ Cyber Security
codered.eccouncil.org/essentials-ser…
❯ Data Analysis
cognitiveclass.ai
❯ Data Science
learn.saylor.org/course/view.ph…
❯ Machine Learning
developers.google.com/machine-learni…
❯ Deep Learning
introtodeeplearning.com
❯ Excel
simplilearn.com/learn-business…
❯ PowerBI
learn.microsoft.com/en-us/users/co…
❯ Tableau
tableau.com/learn/training
❯ MongoDB
learn.mongodb.com
❯ Kafka
developer.confluent.io/courses/
❯ Redis
university.redis.com
- Web Development
- Data Science
- DevOps
🌻🚀با توجه به فیدبک های ارزشمندی که در این چند روز دریافت کردم، در ادامه این پست 25 دوره مقدماتی رو خدمت شما عزیزان معرفی شده که امیدوارم مفید و سودمند باشند.
تقدیم نگاه شما عزیزان:
❯ HTML and CSS
freecodecamp.org/learn/2022/res…
❯ JavaScript
scrimba.com/learn/learnjav…
❯ Python
cs50.harvard.edu/python/2022/
❯ SQL
online.stanford.edu/courses/soe-yd…
❯ Java
scaler.com/topics/course/…
❯ C#
dotnet.microsoft.com/en-us/learn/cs…
❯ C
alison.com/course/diploma…
❯ C++
alison.com/course/c-plus-…
❯ React
scrimba.com/learn/learnrea…
❯ Linux
cybrary.it/instructor/cor…
❯ Docker
cognitiveclass.ai/courses/docker…
❯ Kubernetes
simplilearn.com/learn-kubernet…
❯ DevOps ( احتمالا بعضی بخش ها غیر رایگان )
openclassrooms.com/en/courses/785…
❯ CI/CD
simplilearn.com/free-ci-cd-onl…
❯ Cyber Security
codered.eccouncil.org/essentials-ser…
❯ Data Analysis
cognitiveclass.ai
❯ Data Science
learn.saylor.org/course/view.ph…
❯ Machine Learning
developers.google.com/machine-learni…
❯ Deep Learning
introtodeeplearning.com
❯ Excel
simplilearn.com/learn-business…
❯ PowerBI
learn.microsoft.com/en-us/users/co…
❯ Tableau
tableau.com/learn/training
❯ MongoDB
learn.mongodb.com
❯ Kafka
developer.confluent.io/courses/
❯ Redis
university.redis.com
cs50.harvard.edu
CS50's Introduction to Programming with Python
An introduction to programming using Python, a popular language for general-purpose programming, data science, web programming, and more.
✔️ سوال: best practiceها و ابزارات مورد نیاز برای توسعه یه بسته، لایبرری یا نرمافزار پایتونی چیه؟
ابزارهای زیادی واسه اینکارا وجود داره که بر اساس تجربه و چیزی که از 80 درصد پروژه های معروف و بزرگ دیدم، سعی میکنم بهتریناش رو معرفی کنم:
Dependency Management System
برای مدیریت وابستگی های یک پروژه بزرگ (یا نسبتا بزرگ)، پیشنهاد میکنم از
همچنین
1. آشنایی و شروع به کار با Poetry
https://realpython.com/dependency-management-python-poetry/
2. جزیات عمیق درباره هر قابلیت و نحوه استفاده
https://python-poetry.org/docs
3. نحوه انتشار یک package پایتونی در PyPI به کمک Poetry
https://johnfraney.ca/blog/create-publish-python-package-poetry/
Linting & Type Checking
برای
اگر عادت دارید کدهای خودتون رو
1. داکیومنت Flake8
https://flake8.pycqa.org/en/latest/user/invocation.html
2. داکیومنت MyPy
https://mypy.readthedocs.io/en/stable/getting_started.html
Code Formatting
برای مرتب و
1. داکیومنت isort
https://pycqa.github.io/isort/
2. داکیومنت Black
https://black.readthedocs.io/en/stable/getting_started.html
3. یک ویدیو از PyCon 2019 درباره Black
https://youtu.be/esZLCuWs_2Y
* این ابزارها همگی داکیومنت ساده و خوانایی دارن و به نظرم بهترین منبع همین داکیومنتهاشون هست.
Testing
دو کتابخونه
1. یک مقاله جامع درباره تست نویسی، انواع آن و روشهای مورد استفاده در پایتون
https://realpython.com/python-testing/
2. ویدیو درباره unittest در پایتون
https://m.youtube.com/watch?v=FxSsnHeWQBY
https://www.youtube.com/watch?v=6tNS--WetLI
* همچنین اگر از
وبسایت pre commit:
https://pre-commit.com/
ابزارهای زیادی واسه اینکارا وجود داره که بر اساس تجربه و چیزی که از 80 درصد پروژه های معروف و بزرگ دیدم، سعی میکنم بهتریناش رو معرفی کنم:
Dependency Management System
برای مدیریت وابستگی های یک پروژه بزرگ (یا نسبتا بزرگ)، پیشنهاد میکنم از
Poetry
استفاده کنید، چون ابزار بسیار قدرتمندی هست، کار باهاش بسیار راحته (خیلی شبیه به Cargo
در زبان Rust
هست)، کامیونیتی بزرگی داره، به راحتی محیط dev
و prod
رو میتونید مدیریت کنید، مستندات بسیار خوب و روانی داره، در سریع ترین زمان ممکن میتونید پروژه رو در PyPI
منتشر کنید و همچنین پروژههای معروفی از جمله Rich (کتابخونهای که خود pip
هم ازش برای رنگی کردن progress bar
ها استفاده میکنه) از اون استفاده میکنن، که همین نشون میده چقدر کاربردی هست.همچنین
build
و run
هم توسط Poetry
انجام میشه-
منابع آموزشی:1. آشنایی و شروع به کار با Poetry
https://realpython.com/dependency-management-python-poetry/
2. جزیات عمیق درباره هر قابلیت و نحوه استفاده
https://python-poetry.org/docs
3. نحوه انتشار یک package پایتونی در PyPI به کمک Poetry
https://johnfraney.ca/blog/create-publish-python-package-poetry/
Linting & Type Checking
برای
Linting
ابزارهای flake8
و pylint
از معروف ترینها هستن، هر یک رو میتونید شدت سخت گیریشون رو تنظیم کنید، به راحتی همراه با Poetry
تنظیماتشون در یک فایل قرار میگیره و نیاز به نگه داشتن فایلهای متفاوت برای هر کدوم ندارید. به نظرم خود flake8
به تنهایی نیازتون رو برطرف میکنه. اگر از PyCharm
استفاده کنید یک Linter
به صورت Built-in
در اختیارتون میذاره که خوبه و کارتون رو راه میندازه.اگر عادت دارید کدهای خودتون رو
Annotate
کنید و زیاد از Type Hint
ها استفاده میکنید، استفاده از MyPy
به عنوان یک static type checker
به شما کمک میکنه ایرادات موجود در کلاس ها، توابع و ... رو پیدا کنید و بتونید type
های دقیق تری استفاده کنید. همچنین ابزار Pyright
که توسط مایکروسافت توسعه داده میشه، در VSCode
به صورت integrated
با افزونه Pylance
کار میکنه و اگر از VSCode
استفاده میکنید پیشنهاد میکنم حتما افزونه Pylance
رو نصب کنید. PyCharm
هم یک Type Checker
داره ولی هنوز توانمندی Pylance
و MyPy
رو نداره.-
منابع آموزشی:1. داکیومنت Flake8
https://flake8.pycqa.org/en/latest/user/invocation.html
2. داکیومنت MyPy
https://mypy.readthedocs.io/en/stable/getting_started.html
Code Formatting
برای مرتب و
organize
کردن import
ها از isort
استفاده کنید، هم به صورت CLI
در دسترس هست و هم یک API
داره که میتونید در کد پایتون استفاده کنید. یک code formatter
بسیار معروف که در اکثر پروژهها استفاده میشه Black
هست، زیر نظر PSF
(یا Python Software Foundation
) و برنامه نویسای با تجربه و کار کشته ای همچون آقای Łukasz Langa
(ریلیس منیجر پایتون 3.9) توسعه داده میشه، با دیگر ابزار ها مثل isort
سازگار هست، با PEP8
سازگاره و کلی قابلیت مزیت دیگه داره که حقیقتا اینجا جا نمیشن :)-
منابع آموزشی:1. داکیومنت isort
https://pycqa.github.io/isort/
2. داکیومنت Black
https://black.readthedocs.io/en/stable/getting_started.html
3. یک ویدیو از PyCon 2019 درباره Black
https://youtu.be/esZLCuWs_2Y
* این ابزارها همگی داکیومنت ساده و خوانایی دارن و به نظرم بهترین منبع همین داکیومنتهاشون هست.
Testing
دو کتابخونه
Pytest
و unittest
(در stdlib
موجود هست) در تست نویسی پروژه ها استفاده میشن، برای تست کردن پروژه در environment
های متفاوت از ابزار tox
استفاده میشه و باهاش میتونید در نسخه های متفاوتی از پایتون کدتون رو تست کنید.-
منابع آموزشی:1. یک مقاله جامع درباره تست نویسی، انواع آن و روشهای مورد استفاده در پایتون
https://realpython.com/python-testing/
2. ویدیو درباره unittest در پایتون
-
آقای ned batchelder:https://m.youtube.com/watch?v=FxSsnHeWQBY
-
آقای Corey Schafer:https://www.youtube.com/watch?v=6tNS--WetLI
* همچنین اگر از
Git
در پروژه خودتون استفاده میکنید، پیشنهاد میکنم از pre-commit
حتما استفاده کنید و تمام این ابزارهای گفته شده رو automate
کنید تا در هربار commit
کردن، قبل از اینکه commit
انجام بشه، این ابزارها روی کدتون اجرا بشن و اگر اشکالی در کدتون وجود داره پیدا بشه و اون رو برطرف کنید و دوباره commit کنید.وبسایت pre commit:
https://pre-commit.com/
GitHub
GitHub - Textualize/rich: Rich is a Python library for rich text and beautiful formatting in the terminal.
Rich is a Python library for rich text and beautiful formatting in the terminal. - Textualize/rich
✔️ What is
اول از همه، همه چیز توی پایتون یه آبجکته، زیاد شنیدیم و کلیشه شده ولی جداً یه سری آبجکتا رو نمیشناسیم.
یکی از اون تایپها ModuleType هست.
هر فایلی که سورس کد پایتون توش باشه، رو بهش میگیم ماژول؛ چرا؟ چون پایتون اون رو میگیره، یه آبجکت براش توی مموری درست میکنه.
چرا؟ خب یکی از دلایل منطقیش اینه که هر ماژول یه namespace باید داشته باشه (هر چند راحتتره بگیم هر ماژول یه namespace عه)
خب namespaceها توی پایتون چی هستن؟ خیلی سادهست :) همهشون دیکشنریاند (البته داندر slots قضیهاش فرق میکنه)
هر ماژول هم یکی از پایهای ترین نیاز هاش اینه که namespace داشته باشه تا کلاسها و توابع و متغیرها رو در دسترس ما قرار بده.
پس تا اینجا هر ماژول تبدیل به یه آبجکت میشه و یه namespace محسوب میشه. (اگه نمیشد که منتغی میشد 😂)
اول دنبال فایل میگرده
بعدش لودش میکنه (آبجکتش رو درست میکنه)
بعد کاملا رانش میکنه تا چیزای داخلش رو توی مموری بسازه (همون دیکشنری یا namespaceاش رو populate کنه.)
حالا چون رانش میکنه، ممکنه مثلا پرینتی، صدا زدن تابعی، یک عمل زمانبری چیزی اون داخل وجود داشته باشه که موقع ایمپورت ما نمیخوایم چنین اتفاقی بیوفته. چون واقعا ران میشه.
باید چه کار کنیم؟
هر ModuleType یه اسمی داره، فایلی اصلی که پایتون اول رو ران میکنه اسمش میشه main، اسم هم توی خود namespace عه ماژول ذخیره میشه توی name
اما دیگر ماژولهایی که ایمپورت میشن اسمشون میشه اسم همون فایلشون
الان میدونیم معنیش چیه
که الان میدونیم که وقتی ماژول ایمپورت میشه اسمش اسم فایلشه و داندر مین نیست و این شرط غلط میشه و کدای زیرش اجرا نمیشن
حالا میگیم اجرا نمیشن، اما کامپایل که میشن، پس اگه توی بلوک کد این if تو SyntaxError داشته باشی ارورش رو موقع ایمپورت کردنش میبینی.
ایمپورت کردن چیزی نیست که «ما» بخوایم روی بهینهکردنش وقت بذاریم چون جدا نمیتونیم، اما اگه خود پایتون بهینهاش کنه تاثیری خوبی رو میبینیم. البته نه توی چیزای کوچیک، یه اپلیکیشنی که خیلی ایمپورت زیادی داره توش مشخص میشه و حتی بهتر اگه یه اپلیکیشنی به بزرگی اینستاگرام اون جاست که این بهینهسازی میتونه ساعتها کار رو سریعتر کنه، چجوری؟
یه سیستمی دارن توی پایتون ۳.۱۲ روش کار میکنن به اسم Lazy Imports، چطوری کار میکنه؟ وقتی ایمپورتها تنبل بشن، دیگه همون اول اول همهشون evaluate نمیشن، کداشون execute نمیشه و ... و وقتی که نیاز شد، اون ماژول کداش execute میشه. خب چقدر تاثیر میذاره؟
همه میدونیم که اینستاگرام از پایتون و جنگو استفاده میکنه، شرکت متا (فیسبوک) یه پیادهسازی پایتون داره به اسم Cinder این برای اینستاگرام بهینه شده مثلا garbage collector اش خاموشه و جدیدا مقالهای منتشر کردن که گفتن ما ایمپورتهارو کاملا lazy کردیم.
قبلنا که تنبل نبودن اگه توسعهدهندهای حتی یه فایل رو عوض میکرد، اون سروری که اون فایل رو ران میکرد باید reload میشد و طبق گفته خودشون تا چند دقیقه طول میکشیده این قضیه. اما الان که ایمپورتها تنبل شدن بسیار بسیار سرعت کارشون زیاد شده چون دیگه وقت سر ایمپورت کردن و .... اول کار تلف نمیشه.
پایتون به اندازه کافی سریعه، اما optimization باعث میشه که سریعتر بشه به این چیزا میگن بهینهسازی
if __name__ == "__main__":
?اول از همه، همه چیز توی پایتون یه آبجکته، زیاد شنیدیم و کلیشه شده ولی جداً یه سری آبجکتا رو نمیشناسیم.
یکی از اون تایپها ModuleType هست.
هر فایلی که سورس کد پایتون توش باشه، رو بهش میگیم ماژول؛ چرا؟ چون پایتون اون رو میگیره، یه آبجکت براش توی مموری درست میکنه.
چرا؟ خب یکی از دلایل منطقیش اینه که هر ماژول یه namespace باید داشته باشه (هر چند راحتتره بگیم هر ماژول یه namespace عه)
خب namespaceها توی پایتون چی هستن؟ خیلی سادهست :) همهشون دیکشنریاند (البته داندر slots قضیهاش فرق میکنه)
هر ماژول هم یکی از پایهای ترین نیاز هاش اینه که namespace داشته باشه تا کلاسها و توابع و متغیرها رو در دسترس ما قرار بده.
پس تا اینجا هر ماژول تبدیل به یه آبجکت میشه و یه namespace محسوب میشه. (اگه نمیشد که منتغی میشد 😂)
import typesمیدونی سیستم ایمپورت کردن توی پایتون چجوری کار میکنه؟
print(type(types)) -> <class 'module'>
print(isinstance(types, types.ModuleType)) -> True
اول دنبال فایل میگرده
بعدش لودش میکنه (آبجکتش رو درست میکنه)
بعد کاملا رانش میکنه تا چیزای داخلش رو توی مموری بسازه (همون دیکشنری یا namespaceاش رو populate کنه.)
حالا چون رانش میکنه، ممکنه مثلا پرینتی، صدا زدن تابعی، یک عمل زمانبری چیزی اون داخل وجود داشته باشه که موقع ایمپورت ما نمیخوایم چنین اتفاقی بیوفته. چون واقعا ران میشه.
باید چه کار کنیم؟
هر ModuleType یه اسمی داره، فایلی اصلی که پایتون اول رو ران میکنه اسمش میشه main، اسم هم توی خود namespace عه ماژول ذخیره میشه توی name
اما دیگر ماژولهایی که ایمپورت میشن اسمشون میشه اسم همون فایلشون
hola.pyپایتون یه شرط معروفی داره که صورت سوال ماست:
hello.py
# inside hola.py
print(name)
# inside hello.py
import hola
# run hello.py
output: hola
الان میدونیم معنیش چیه
if __name__ == "__main__":داره میگه اگه ماژولی که ران میکنی اسمش main هست کدای زیرش رو اجرا کن
که الان میدونیم که وقتی ماژول ایمپورت میشه اسمش اسم فایلشه و داندر مین نیست و این شرط غلط میشه و کدای زیرش اجرا نمیشن
حالا میگیم اجرا نمیشن، اما کامپایل که میشن، پس اگه توی بلوک کد این if تو SyntaxError داشته باشی ارورش رو موقع ایمپورت کردنش میبینی.
ایمپورت کردن چیزی نیست که «ما» بخوایم روی بهینهکردنش وقت بذاریم چون جدا نمیتونیم، اما اگه خود پایتون بهینهاش کنه تاثیری خوبی رو میبینیم. البته نه توی چیزای کوچیک، یه اپلیکیشنی که خیلی ایمپورت زیادی داره توش مشخص میشه و حتی بهتر اگه یه اپلیکیشنی به بزرگی اینستاگرام اون جاست که این بهینهسازی میتونه ساعتها کار رو سریعتر کنه، چجوری؟
یه سیستمی دارن توی پایتون ۳.۱۲ روش کار میکنن به اسم Lazy Imports، چطوری کار میکنه؟ وقتی ایمپورتها تنبل بشن، دیگه همون اول اول همهشون evaluate نمیشن، کداشون execute نمیشه و ... و وقتی که نیاز شد، اون ماژول کداش execute میشه. خب چقدر تاثیر میذاره؟
همه میدونیم که اینستاگرام از پایتون و جنگو استفاده میکنه، شرکت متا (فیسبوک) یه پیادهسازی پایتون داره به اسم Cinder این برای اینستاگرام بهینه شده مثلا garbage collector اش خاموشه و جدیدا مقالهای منتشر کردن که گفتن ما ایمپورتهارو کاملا lazy کردیم.
قبلنا که تنبل نبودن اگه توسعهدهندهای حتی یه فایل رو عوض میکرد، اون سروری که اون فایل رو ران میکرد باید reload میشد و طبق گفته خودشون تا چند دقیقه طول میکشیده این قضیه. اما الان که ایمپورتها تنبل شدن بسیار بسیار سرعت کارشون زیاد شده چون دیگه وقت سر ایمپورت کردن و .... اول کار تلف نمیشه.
پایتون به اندازه کافی سریعه، اما optimization باعث میشه که سریعتر بشه به این چیزا میگن بهینهسازی
✔️ استیبل بودن یا نبودن یک الگوریتم مرتب سازی
یکی از دسته بندی های موجود برای الگوریتم های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
دوستان ترم یک که ورودی های جدید دانشگاه هستند دوره های که براتون قرار میدم این دوره ها مفاهیم و مبانی برنامه نویسی و الگوریتم رو حتما استفاده کنید در درک مسائل الگوریتم و برنامه نویسی بهتون کمک میکنند
🧑💻PythonDev🧑💻
https://ocw.sharif.edu/course/id/522
خلاقیت الگوریتمی و برنامه نویسی پایتون
🧑💻PythonDev🧑💻
https://ocw.sharif.edu/course/id/267
درس طراحی الگوریتم ها
این دوره های که براتون قرار دادم بعضی هاشون دارای تمرین و یادداشت هستند و پاسخ نامه هر تمرین بعد از هر تمرین که حل شده به صورت فایل و به طور کامل و جامع توضیحات داده شده هستند
🧑💻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
هست (البته که حوصله آدم سر میره بعضی وقتها تا گزارشش آماده بشه)حتما برای کاستومایز کردن خروجیها و بررسی دقیقتر داکیومنتش رو نگاه کنید (سعی کردم مهمترین مواردی که شخصا استفاده میکنم رو بگم فقط).