هیچوقت نباید اسم ماژولی که داریم داخلش کد میزنیم رو اسم یکی از ماژول/پکیج های خود پایتون یا ماژول/پکیج هایی که نصب کردیمشون تا استفاده کنیم قرار بدیم...
مثال: من قرار هست با تاریخ کمی کار کنم و خب ماژول datetime رو که پایتون توی استاندارد لایبرری گذاشته رو import میکنم. ولی اسم فایل یا ماژولی که دارم کد میزنم داخلش رو میذارم datetime.py !
# datetime.py
import datetime
t = datetime.date(2020, 10, 10)
print(t)
اروری دریافت میکنم :
AttributeError: partially initialized module 'datetime' has no attribute 'date' (most likely due to a circular import)
این ارور تا حدی خوبه یه چیزایی داره بهمون راجع partially initialized شدن و همچنین circular import میگه...
سناریوی بد موقعی هست که اسم فایلی که دارم توش کد میزنم datetime نیست ولی کنار فایلم توی "همون پوشه" یه فایل به اسم datetime.py به اشتباه درست کردم و خالی هست... حالا چی :
# main.py
import datetime
t = datetime.date(2020, 10, 10)
print(t)
متن ارور :
AttributeError: module 'datetime' has no attribute 'date'
این جا دیگه نه تنها کمک نمیکنه بلکه باعث میشه اول فکر کنیم که خب آها حتما این ماژول قبلا attribute عه date رو داشته الان حذف کردن برم ببینم معادلش چیه! یا اگه مثلا datetime ماژولی بوده باشه که نصب کرده بودیم، حتما ما ورژن دیگه ای ازشو نصب کردیم... ما که عین کدی که مثلا توی ویدیو آموزشی هست رو داریم میزنیم چرا میگه date رو نداره ؟؟
ماجرا از این قرار هست که وقتی دارید یه ماژولی رو import میکنید ، پایتون یه مسیر های مشخصی رو برای پیدا کردن اون ماژول طی میکنه که میتونید با پرینت کردن sys.path ببینید :
import sys
for path in sys.path:
print(path)
توی ویندوز حدودا(ممکنه بسته به نسخه پایتون و platform ترتیبش فرق کنه یا کم و زیاد باشه ما کاری به این قضیه نداریم) به این شکل هست: (اون فولدر test فولدری هست که ماژولی که داره ران میشه داخلش هست)
C:\Users\usr\Desktop\test
C:\Users\usr\...\Python39\python39.zip
C:\Users\usr\...\Python39\DLLs
C:\Users\usr\...\Python39\lib
C:\Users\usr\...\Python39
C:\Users\usr\...\Python39\lib\site-packages
پایتون این مسیر هارو "به ترتیب" از بالا تا پایین چک میکنه تا ماژولی که اسمشو جلوی import statement زدیم رو پیدا کنه و "به محض" اینکه بهش برسه همون رو برای ما import میکنه.
به مسیر ها نگاه کنید: اولین مسیر همیشه مسیری هست که script شما داخلش هست. (اگه PYTHONPATH رو set کرده باشید به عنوان مسیر دوم بعد از current directory اضافه میشه به sys.path. ) یه مسیر دیگه اون folder عه site-packages هست که میبینید. این دقیقا همونجایی هست که پکیج هایی که نصب میکنید داخلش میرن. باقی مسیر ها هم برای ماژول های دیگه ی پایتون هستند.
حالا میتونیم دلیلشو متوجه بشیم چرا پایتون توی هر دو مثالی که اول پست زدیم اول پکیج مارو پیدا کرد... site-package و فولدر های دیگه ای که ماژول های خود پایتون داخلش هستن "بعد" از اولین مسیری که داخل لیست دیدیم سرچ میشن پس در نتیجه اینجا datetime داره اشاره میکنه به همین ماژولی که داریم توش کد میزنیم(مثال اول) یا اون ماژول datetime ای که کنار فایمون ساختیم (مثال دوم)... اونو پایتون پیدا میکنه و میاره و خب طبیعتا ما چیزی به عنوان "date" تعریف نکرده بودیم !!
اگه کمی کلی تر بخوایم بگیم در واقع "هرجا" از این مسیرها یه فایل datetime.py قرار بدیم که نسبت به اونی که پایتون توی استاندارد لایبرری قرار داده جلوتر باشه این مشکل رو داریم...
سوال: همه ی ماژول ها به همین صورت هستن ؟ نه ! اون هایی که داخل مفسر compile شدن شامل موارد بالا نمیشن یعنی اگه اسم فایلتون رو این اسامی بذارین باعث نمیشه پایتون اونارو پیدا کنه اول. اینجوری ببینینشون :
import sys
for i in sys.builtin_module_names:
print(i)
هیچوقت مثلا gc.py شما زود تر پیدا نمیشه.
مثال: من قرار هست با تاریخ کمی کار کنم و خب ماژول datetime رو که پایتون توی استاندارد لایبرری گذاشته رو import میکنم. ولی اسم فایل یا ماژولی که دارم کد میزنم داخلش رو میذارم datetime.py !
# datetime.py
import datetime
t = datetime.date(2020, 10, 10)
print(t)
اروری دریافت میکنم :
AttributeError: partially initialized module 'datetime' has no attribute 'date' (most likely due to a circular import)
این ارور تا حدی خوبه یه چیزایی داره بهمون راجع partially initialized شدن و همچنین circular import میگه...
سناریوی بد موقعی هست که اسم فایلی که دارم توش کد میزنم datetime نیست ولی کنار فایلم توی "همون پوشه" یه فایل به اسم datetime.py به اشتباه درست کردم و خالی هست... حالا چی :
# main.py
import datetime
t = datetime.date(2020, 10, 10)
print(t)
متن ارور :
AttributeError: module 'datetime' has no attribute 'date'
این جا دیگه نه تنها کمک نمیکنه بلکه باعث میشه اول فکر کنیم که خب آها حتما این ماژول قبلا attribute عه date رو داشته الان حذف کردن برم ببینم معادلش چیه! یا اگه مثلا datetime ماژولی بوده باشه که نصب کرده بودیم، حتما ما ورژن دیگه ای ازشو نصب کردیم... ما که عین کدی که مثلا توی ویدیو آموزشی هست رو داریم میزنیم چرا میگه date رو نداره ؟؟
ماجرا از این قرار هست که وقتی دارید یه ماژولی رو import میکنید ، پایتون یه مسیر های مشخصی رو برای پیدا کردن اون ماژول طی میکنه که میتونید با پرینت کردن sys.path ببینید :
import sys
for path in sys.path:
print(path)
توی ویندوز حدودا(ممکنه بسته به نسخه پایتون و platform ترتیبش فرق کنه یا کم و زیاد باشه ما کاری به این قضیه نداریم) به این شکل هست: (اون فولدر test فولدری هست که ماژولی که داره ران میشه داخلش هست)
C:\Users\usr\Desktop\test
C:\Users\usr\...\Python39\python39.zip
C:\Users\usr\...\Python39\DLLs
C:\Users\usr\...\Python39\lib
C:\Users\usr\...\Python39
C:\Users\usr\...\Python39\lib\site-packages
پایتون این مسیر هارو "به ترتیب" از بالا تا پایین چک میکنه تا ماژولی که اسمشو جلوی import statement زدیم رو پیدا کنه و "به محض" اینکه بهش برسه همون رو برای ما import میکنه.
به مسیر ها نگاه کنید: اولین مسیر همیشه مسیری هست که script شما داخلش هست. (اگه PYTHONPATH رو set کرده باشید به عنوان مسیر دوم بعد از current directory اضافه میشه به sys.path. ) یه مسیر دیگه اون folder عه site-packages هست که میبینید. این دقیقا همونجایی هست که پکیج هایی که نصب میکنید داخلش میرن. باقی مسیر ها هم برای ماژول های دیگه ی پایتون هستند.
حالا میتونیم دلیلشو متوجه بشیم چرا پایتون توی هر دو مثالی که اول پست زدیم اول پکیج مارو پیدا کرد... site-package و فولدر های دیگه ای که ماژول های خود پایتون داخلش هستن "بعد" از اولین مسیری که داخل لیست دیدیم سرچ میشن پس در نتیجه اینجا datetime داره اشاره میکنه به همین ماژولی که داریم توش کد میزنیم(مثال اول) یا اون ماژول datetime ای که کنار فایمون ساختیم (مثال دوم)... اونو پایتون پیدا میکنه و میاره و خب طبیعتا ما چیزی به عنوان "date" تعریف نکرده بودیم !!
اگه کمی کلی تر بخوایم بگیم در واقع "هرجا" از این مسیرها یه فایل datetime.py قرار بدیم که نسبت به اونی که پایتون توی استاندارد لایبرری قرار داده جلوتر باشه این مشکل رو داریم...
سوال: همه ی ماژول ها به همین صورت هستن ؟ نه ! اون هایی که داخل مفسر compile شدن شامل موارد بالا نمیشن یعنی اگه اسم فایلتون رو این اسامی بذارین باعث نمیشه پایتون اونارو پیدا کنه اول. اینجوری ببینینشون :
import sys
for i in sys.builtin_module_names:
print(i)
هیچوقت مثلا gc.py شما زود تر پیدا نمیشه.
انواع سرچ ها روی لیست:
خیلی خلاصه چند تا از انواع سرچ ها رو روی لیست باهم ببینیم:
فرض کنید یه لیست نا مرتبی از اعداد داریم به این شکل:
lst = [30, 2, 7, 14, 1, 25, 4, 15, 9]
اگه بخواهیم دنبال عدد ۱۵ بگردیم باید چیکار کنیم؟
1- Linear search(not optimized)
میتونیم از ایندکس شماره صفر شروع کنیم و تک تک تا انتها بریم جلو و اعداد رو نگاه کنیم ببینیم ۱۵ داخلشون هست یا نه. این درواقع کاری هست که پایتون انجام میده زمانی که شما از in استفاده میکنید. چون اعداد ترتیبی ندارن کار دیگه ای نمیشه کرد.
________________________________________
اگه اعداد مرتب بودن چی؟
lst = [1, 2, 4, 7, 9, 14, 15, 25, 30]
2- Linear search(optimized)
فرض کنیم میخواهیم دنبال عدد ۵ بگردیم. دوباره میتونیم شروع کنیم تک تک اعداد رو مقایسه کنیم، ولی بعد از اینکه به عدد ۷ رسیدیم، میتونیم دیگه ادامه ندیم. چون اعداد مرتب هستن، حتما توی اعداد بزرگتر از ۷ هم نخواهد بود. بهتر شد اینجا.
3- Jump search
میتونیم به جای اینکه تک تک به جلو بریم و اعداد رو، چند تا چند تا جلو بریم و بپریم اصطلاحا (jump search).
فرض کنید دنبال عدد ۲۵ میگردیم. میتونیم اعداد رو ۲ تا ۲ تا جلو بریم، یعنی اول ایندکس شماره ۰ (یا عدد ۱) و نگاه میکنیم، بعد میریم ایندکس شماره ۲ (یا عدد ۴)، بعد ایندکس شماره ۴ (یا عدد ۹) و تا آخر، هر جا که دیدیم عدد ایندکس مورد نظر بزرگتر از عدد مقصود ماست، یعنی به اون تیکه از لیست که ممکنه عدد هدف داخلش باشه رسیدیم، فقط کافیه داخل اون رو به صورت linear نگاه کنیم. برای پیدا کردن عدد ۲۵ ، فقط ۶ تا مقایسه لازم بود. (تو حالت خطی ۸ تا). حالا این jump ما چقدر باشه خوبه؟ محاسبات نشون میده که رادیکال n بهترین گام هست. ( n تعداد آیتم های داخل لیست هست)
4- Binary search
کافیه توی هر مرحله لیستمون رو به دو قسمت تقسیم کنیم، و آیتم هدف رو با آیتم وسطی مقایسه کنیم، اگه کوچیکتر بود، دیگه فقط توی اون نیمه ی سمت چپ دنبالش میگردیم، اگه بزرگتر بود توی نیمه ی سمت راست. و دوباره همینکار رو تکرار میکنیم تا به هدف برسیم.
5- Interpolation search
خیلی شبیه binary search هست با این تفاوت که اونجا نقطه ای که لیست ما رو تقسیم میکرد و دقیقا وسط لیست میگرفتیم، ولی اینجا با استفاده از این فرمول، اون نقطه رو بدست میاریم:
mid = low + ((key - arr[low]) * (high - low) / (arr[high] - arr[low]));
low = کوچکترین ایندکس
high = بزرگترین ایندکس
key = آیتم هدف
این فرمول نقطه ی تقسیم رو مایل به چپ یا راست پیدا میکنه، نزدیک تر به آیتم هدف. ولی برای اینکه interpolation search بتونه خیلی سریع عمل کنه، باید لیست ما به صورت یکنواخت توزیع شده باشه.
6 - Exponential search
توی این روش که برای لیست های خیلی بزرگ کاربرد داره، از ابتدا شروع میکنیم به گشتن، ولی گام های ما به صورت exponential هست (توان های ۲):
0, 1, 4, 9, 16, 25, ...
وقتی که آیتمی پیدا کردیم که از آیتم هدف ما بزرگتر بود، میایم اون تیکه رو دوباره فقط جست و جو میکنیم(مثل jump search) ولی دیگه این جست و جو خطی نیست بلکه روش binary search انجام میدیم.
نکته: این الگوریتم ها بسته به شرایط الگوریتم های خیلی بهتری هستن از کاری که پایتون انجام میده. به پایتون حتی اگه لیست مرتب شده هم بدید باز تک تک سرچ میکنه. ولی خب نکته اینجاست که اون با C پیاده سازی شده و احتمالا توی خیلی از پیاده سازی های pure python از الگوریتم هایی با time complexity بهتر سریعتر باشه.
در آینده سعی میکنم بیشتر درمورد time complexity ی هرکدوم از این انواع سرچ و اینکه کجا کدوم بهتره استفاده بشه صحبت کنیم.
خیلی خلاصه چند تا از انواع سرچ ها رو روی لیست باهم ببینیم:
فرض کنید یه لیست نا مرتبی از اعداد داریم به این شکل:
lst = [30, 2, 7, 14, 1, 25, 4, 15, 9]
اگه بخواهیم دنبال عدد ۱۵ بگردیم باید چیکار کنیم؟
1- Linear search(not optimized)
میتونیم از ایندکس شماره صفر شروع کنیم و تک تک تا انتها بریم جلو و اعداد رو نگاه کنیم ببینیم ۱۵ داخلشون هست یا نه. این درواقع کاری هست که پایتون انجام میده زمانی که شما از in استفاده میکنید. چون اعداد ترتیبی ندارن کار دیگه ای نمیشه کرد.
________________________________________
اگه اعداد مرتب بودن چی؟
lst = [1, 2, 4, 7, 9, 14, 15, 25, 30]
2- Linear search(optimized)
فرض کنیم میخواهیم دنبال عدد ۵ بگردیم. دوباره میتونیم شروع کنیم تک تک اعداد رو مقایسه کنیم، ولی بعد از اینکه به عدد ۷ رسیدیم، میتونیم دیگه ادامه ندیم. چون اعداد مرتب هستن، حتما توی اعداد بزرگتر از ۷ هم نخواهد بود. بهتر شد اینجا.
3- Jump search
میتونیم به جای اینکه تک تک به جلو بریم و اعداد رو، چند تا چند تا جلو بریم و بپریم اصطلاحا (jump search).
فرض کنید دنبال عدد ۲۵ میگردیم. میتونیم اعداد رو ۲ تا ۲ تا جلو بریم، یعنی اول ایندکس شماره ۰ (یا عدد ۱) و نگاه میکنیم، بعد میریم ایندکس شماره ۲ (یا عدد ۴)، بعد ایندکس شماره ۴ (یا عدد ۹) و تا آخر، هر جا که دیدیم عدد ایندکس مورد نظر بزرگتر از عدد مقصود ماست، یعنی به اون تیکه از لیست که ممکنه عدد هدف داخلش باشه رسیدیم، فقط کافیه داخل اون رو به صورت linear نگاه کنیم. برای پیدا کردن عدد ۲۵ ، فقط ۶ تا مقایسه لازم بود. (تو حالت خطی ۸ تا). حالا این jump ما چقدر باشه خوبه؟ محاسبات نشون میده که رادیکال n بهترین گام هست. ( n تعداد آیتم های داخل لیست هست)
4- Binary search
کافیه توی هر مرحله لیستمون رو به دو قسمت تقسیم کنیم، و آیتم هدف رو با آیتم وسطی مقایسه کنیم، اگه کوچیکتر بود، دیگه فقط توی اون نیمه ی سمت چپ دنبالش میگردیم، اگه بزرگتر بود توی نیمه ی سمت راست. و دوباره همینکار رو تکرار میکنیم تا به هدف برسیم.
5- Interpolation search
خیلی شبیه binary search هست با این تفاوت که اونجا نقطه ای که لیست ما رو تقسیم میکرد و دقیقا وسط لیست میگرفتیم، ولی اینجا با استفاده از این فرمول، اون نقطه رو بدست میاریم:
mid = low + ((key - arr[low]) * (high - low) / (arr[high] - arr[low]));
low = کوچکترین ایندکس
high = بزرگترین ایندکس
key = آیتم هدف
این فرمول نقطه ی تقسیم رو مایل به چپ یا راست پیدا میکنه، نزدیک تر به آیتم هدف. ولی برای اینکه interpolation search بتونه خیلی سریع عمل کنه، باید لیست ما به صورت یکنواخت توزیع شده باشه.
6 - Exponential search
توی این روش که برای لیست های خیلی بزرگ کاربرد داره، از ابتدا شروع میکنیم به گشتن، ولی گام های ما به صورت exponential هست (توان های ۲):
0, 1, 4, 9, 16, 25, ...
وقتی که آیتمی پیدا کردیم که از آیتم هدف ما بزرگتر بود، میایم اون تیکه رو دوباره فقط جست و جو میکنیم(مثل jump search) ولی دیگه این جست و جو خطی نیست بلکه روش binary search انجام میدیم.
نکته: این الگوریتم ها بسته به شرایط الگوریتم های خیلی بهتری هستن از کاری که پایتون انجام میده. به پایتون حتی اگه لیست مرتب شده هم بدید باز تک تک سرچ میکنه. ولی خب نکته اینجاست که اون با C پیاده سازی شده و احتمالا توی خیلی از پیاده سازی های pure python از الگوریتم هایی با time complexity بهتر سریعتر باشه.
در آینده سعی میکنم بیشتر درمورد time complexity ی هرکدوم از این انواع سرچ و اینکه کجا کدوم بهتره استفاده بشه صحبت کنیم.
Wikipedia
Jump search
search algorithm
اگر به دنبال یک منبع خوب برای یادگیری اجمالی Type hint ها به همراه مثال هستید، داکیومنت mypy یک منبع مناسب برای شماست.
Link: https://mypy.readthedocs.io/en/stable/index.html
Link: https://mypy.readthedocs.io/en/stable/index.html
خوب دوستان لیستی که قراره براتون به شرح زیر هستش من سعی میکنم دوره های انگلیسی رو هم بزارم واسه دوستانی که زبان انگلیسی خوبی دارند و میخواهند دوره های خارجی رو مشاهده کنند
دوره ها به شرح زیر هستند
1 ) دوره آموزش پایتون مقدماتی استاد جادی
2) دوره اموزش پایتون رضا دولتی سایت سبز لرن
3) دوره اموزش پایتون امیر حسین معلمی سایت نابغه ها
4) دوره اموزش پایتون امیر حسین امیری سایت کد یاد
دوره های تو اموزش پایتون که فارسی اموزش میدن زیاد هستند که ممکنه من حتی خیلی ها رو از قلم انداخته باشم ولی دوره پایتون سون لرن و دوره پایتون توسینسو هم هست
ولی واسه دوستانی که میخوان دوره های خارجی پایتون دسترسی داشته باشن ولی به محتوا رو ندارن
1) دوره پایتون یودمی
2) دوره پایتون لیندا
من کس دیگه ای رو نمیشناسم ولی دوستانی که میخوام دوره پایتون انگلیسی رو دریافت کنند میتونند تو پی وی بنده که مراجعه کنند تا من این دوره در اختیارشون قرار بدم شبتون بخیر موفق و موید باشید
دوره ها به شرح زیر هستند
1 ) دوره آموزش پایتون مقدماتی استاد جادی
2) دوره اموزش پایتون رضا دولتی سایت سبز لرن
3) دوره اموزش پایتون امیر حسین معلمی سایت نابغه ها
4) دوره اموزش پایتون امیر حسین امیری سایت کد یاد
دوره های تو اموزش پایتون که فارسی اموزش میدن زیاد هستند که ممکنه من حتی خیلی ها رو از قلم انداخته باشم ولی دوره پایتون سون لرن و دوره پایتون توسینسو هم هست
ولی واسه دوستانی که میخوان دوره های خارجی پایتون دسترسی داشته باشن ولی به محتوا رو ندارن
1) دوره پایتون یودمی
2) دوره پایتون لیندا
من کس دیگه ای رو نمیشناسم ولی دوستانی که میخوام دوره پایتون انگلیسی رو دریافت کنند میتونند تو پی وی بنده که مراجعه کنند تا من این دوره در اختیارشون قرار بدم شبتون بخیر موفق و موید باشید
🧑💻PythonDev🧑💻 pinned «خوب دوستان لیستی که قراره براتون به شرح زیر هستش من سعی میکنم دوره های انگلیسی رو هم بزارم واسه دوستانی که زبان انگلیسی خوبی دارند و میخواهند دوره های خارجی رو مشاهده کنند دوره ها به شرح زیر هستند 1 ) دوره آموزش پایتون مقدماتی استاد جادی 2) دوره اموزش…»
این آخرین پست درباره موضوع لینوکس و ... هست (با توجه به اتفاقات اخیر)
ببخشید که کمی از بحث دور شدم؛ اما هدف داشتم
خیلی از بچههایی که روی AI کار میکنند و خیلی دیگه از توسعه دهندههای پایتون که وقت کاستومایز کردن و ... ندارند به جز Ubuntu متاسفانه گزینه دیگری ندارند برای همین وقتی دیدم Ubuntu دیگه رو به افول گذاشته (تمرکزش روی سرور هست و داره تلاش میکنه مثل RedHat بتونه از سرور پول در بیاره) ترجیح دادم کمی از موضوع اصلی کانال دور بشم و روی جایگزینهای Ubuntu صحبت کنم.
توزیعهای بسیار زیادی رو دوستان معرفی کردند و خودم میشناختم اما موضوع پشتیبانی از فریمورکها و پکیجهای مورد نیاز AI هم بود و البته سادگی راهاندازی توزیع هدف و میزان استیبل بودنش
همه اینها من رو رسوند به
1- روی کاغذ هیچ توزیعی به اندازه این مورد استیبل نیست (که رایگان هم باشه) از روی
۲- راهاندازیش میتونه به اندازه سواد و توانایی شما؛ ساده یا سخت باشه
مثلا من برای راهاندازی چون کارت گرافیک
3- پکیجهایی که وجود نداره رو توی
چندتا توصیه اگر این ویژگیها رو دوست دارید و دستی هم بر آتش دارید یا علاقه به کاستومایز کردن :
در نهایت
تا اینجا هنوز هیچکدوم از مشکلات
امیدوارم تا چندسال آبنده هم همینطوری بمونه.
جایگزین مناسب برای
ببخشید که کمی از بحث دور شدم؛ اما هدف داشتم
خیلی از بچههایی که روی AI کار میکنند و خیلی دیگه از توسعه دهندههای پایتون که وقت کاستومایز کردن و ... ندارند به جز Ubuntu متاسفانه گزینه دیگری ندارند برای همین وقتی دیدم Ubuntu دیگه رو به افول گذاشته (تمرکزش روی سرور هست و داره تلاش میکنه مثل RedHat بتونه از سرور پول در بیاره) ترجیح دادم کمی از موضوع اصلی کانال دور بشم و روی جایگزینهای Ubuntu صحبت کنم.
توزیعهای بسیار زیادی رو دوستان معرفی کردند و خودم میشناختم اما موضوع پشتیبانی از فریمورکها و پکیجهای مورد نیاز AI هم بود و البته سادگی راهاندازی توزیع هدف و میزان استیبل بودنش
همه اینها من رو رسوند به
Rocky Linux
:1- روی کاغذ هیچ توزیعی به اندازه این مورد استیبل نیست (که رایگان هم باشه) از روی
RedHat Enterprise
ساخته میشه و افراد مهمی پشتش هستند ( کسانی که CentOS
رو این همه سال توسعه دادند )؛ پشتیبانی ۱۰ ساله هم داره ورژنهای اصلی.۲- راهاندازیش میتونه به اندازه سواد و توانایی شما؛ ساده یا سخت باشه
مثلا من برای راهاندازی چون کارت گرافیک
Onboard
ندارم نمیتونستم از نسخه workstation
برای نصب استفاده کنم و رفتم سراغ نسخه minimal
ترتیب نصب هم برای اینکه به مشکل نخورید :Rocky linux minimal --> install
tty : --> sudo dnf update
reboot
sudo dnf install group Workstation
nvidia-driver installation (follow cuda installation documentation instructions)
Before Reboot, Disable nouveau
reboot
Install cuda and ...
۲ تا نکته من چون تنبل بودم install group
رو استفاده کرد بعد مواردی که بدردم نمیخورد رو حذف یا ادیت کردمcuda, cudnn,
رو از روی داکیومنت اصلی خودشون که سایت nvidia
منتشر کرده نصب کردم و بعد از نصب (چون ورژن قدیمی تر رو میخواستم نه آخرین نسخه) repo
اش رو حذف کردم.3- پکیجهایی که وجود نداره رو توی
epel-release, flatpak, rpmfusion
قطعا پیدا میکنید که خیلی راحت نصب میشه چندتا توصیه اگر این ویژگیها رو دوست دارید و دستی هم بر آتش دارید یا علاقه به کاستومایز کردن :
Xfce
رو بجای Gnome
استفاده کنید؛ چندتا باگ وجود داره که احتمالا بخاطر تجهیزات من هست (البته بسیار بسیار کمتر از میزان تغییراتی هست که روی Ubuntu
باید میدادم تا سختافزارهام کار کنه) و اینکه آزار دهنده نیست.در نهایت
Python3.10
وجود نداره که خب باید کامپایل کنید و نصب کنید؛ اصلا هم سخت نیست دیگه (دیفالت 3.9 نصب هست و روی رپو هم 3.11 وجود داره) من اینطوری نصب کردم :dnf updateبرای دستور بعدی من ۱۴ تا ترد رو در اختیار گذاشتم که سریعتر کامپایل بشه (این عدد رو کمتر میتونید بکنید شما)
dnf install gcc openssl-devel bzip2-devel libffi-devel zlib-devel wget make sqlite-devel xz-devel
wget https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tgz
tar xzf Python-3.10.13.tgz
cd Python-3.10.13
./configure --enable-optimizations
make -j 14بعد هم تست کنید که درست نصب شده باشه.
nproc
make altinstall
تا اینجا هنوز هیچکدوم از مشکلات
ubuntu
رو ندارم و با نصب هیچکدوم از پکیجها هم به مشکل نخوردم (حتی مشکلات و ارورهای بعد از نصب که توی ubuntu
وجود داشت رو هم ندارم)امیدوارم تا چندسال آبنده هم همینطوری بمونه.
جایگزین مناسب برای
Ubuntu
توی کارهای ما فعلا فقط و فقط Rocky Linux
رو میتونم تایید کنم.✅ نصب ورژن خاص پایتون بر روی لینوکس
❓ سوال: من یه پروژه دارم روی ورژن خاصی از پایتون کار میکنه (برای مثال ۳.۸.۱۰) وقتی میام با دستور apt نصب کنم ورژن ۳.۸.۱۷ (آخرین رلیس ورژن) نصب میشه چطوری رلیس های قبلی رو نصب کنم؟
برای این کار شما نیاز به نصب دستی ورژن مورد نظر دارید.
۱) فایل سورس ورژن مورد نظر رو از python.org دانلود می کنید.
۲)در پوشه مورد نظر کانفیگ فایل رو میسازیم
./configure \
--prefix=/opt/python/${PYTHON_VERSION} \
--enable-shared \
--enable-optimizations \
--enable-ipv6 \
LDFLAGS=-Wl,-rpath=/opt/python/${PYTHON_VERSION}/lib,--disable-new-dtags
۳) دستور make
و سپس sudo make install رو اجرا میکنیم.
۴) برای اضافه کردن به path هم دستور زیر رو به فایل
/etc/profile.d/python.sh
اضافه میکنیم.
PATH=/opt/python/<PYTHON-VERSION>/bin/:$PATH
۵) برای نصب pip هم از این فایل میتونید استفاده کنید فقط کافیه با ورژنی که میخواید پیپ داشته باشه این فایل رو اجرا کنید.
https://bootstrap.pypa.io/get-pip.py
❓ سوال: من یه پروژه دارم روی ورژن خاصی از پایتون کار میکنه (برای مثال ۳.۸.۱۰) وقتی میام با دستور apt نصب کنم ورژن ۳.۸.۱۷ (آخرین رلیس ورژن) نصب میشه چطوری رلیس های قبلی رو نصب کنم؟
برای این کار شما نیاز به نصب دستی ورژن مورد نظر دارید.
۱) فایل سورس ورژن مورد نظر رو از python.org دانلود می کنید.
۲)در پوشه مورد نظر کانفیگ فایل رو میسازیم
./configure \
--prefix=/opt/python/${PYTHON_VERSION} \
--enable-shared \
--enable-optimizations \
--enable-ipv6 \
LDFLAGS=-Wl,-rpath=/opt/python/${PYTHON_VERSION}/lib,--disable-new-dtags
۳) دستور make
و سپس sudo make install رو اجرا میکنیم.
۴) برای اضافه کردن به path هم دستور زیر رو به فایل
/etc/profile.d/python.sh
اضافه میکنیم.
PATH=/opt/python/<PYTHON-VERSION>/bin/:$PATH
۵) برای نصب pip هم از این فایل میتونید استفاده کنید فقط کافیه با ورژنی که میخواید پیپ داشته باشه این فایل رو اجرا کنید.
https://bootstrap.pypa.io/get-pip.py
🙋معرفی 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
درس طراحی الگوریتم ها
این دوره های که براتون قرار دادم بعضی هاشون دارای تمرین و یادداشت هستند و پاسخ نامه هر تمرین بعد از هر تمرین که حل شده به صورت فایل و به طور کامل و جامع توضیحات داده شده هستند