The_Recursive_Book_of_Recursion_Ace_the_Coding_Interview_with_Python.pdf
10.2 MB
The Recursive Book of Recursion: Ace the Coding Interview with Python and JavaScript
#درخواستی
@raspberry_python
#درخواستی
@raspberry_python
Class-based vs Function-based Views in Django
https://testdriven.io/blog/django-class-based-vs-function-based-views/
@raspberry_python
https://testdriven.io/blog/django-class-based-vs-function-based-views/
@raspberry_python
✔️ فرض کنیم چنین سوالی داریم
"میخوایم ببینیم، آیا حرف nام letters در کلمه nام words وجود داره یا نه"
دو راه داریم که مشخص شدن.
بدون ران کردن و تست سرعت کد، این خیلی مهمه، بگید کدوم کندتره؟
و برای جوابتون حتما دلیل بتراشید
[خط سوم (choice) درست هست]
#M4hdi
〰️〰️〰️〰️〰️〰️〰️
©@raspberry_python
"میخوایم ببینیم، آیا حرف nام letters در کلمه nام words وجود داره یا نه"
دو راه داریم که مشخص شدن.
بدون ران کردن و تست سرعت کد، این خیلی مهمه، بگید کدوم کندتره؟
و برای جوابتون حتما دلیل بتراشید
[خط سوم (choice) درست هست]
#M4hdi
〰️〰️〰️〰️〰️〰️〰️
©@raspberry_python
"سلام دوستان، میخواستم بدونم کسی کنکور دکترا هوش مصنوعی داده؟میخواستم ببینم منابع مطالعاتیتون رو بدونم"
اگه کسی جواب این سوال رو میدونه لطفا به این ایدی پیام بده
@Elecgirl66
اگه کسی جواب این سوال رو میدونه لطفا به این ایدی پیام بده
@Elecgirl66
Forwarded from 🐍 Python & Raspberry 🐍
Forwarded from мя.àmìņ™
سلام
من یک ریپازیتوری ساختم در گیتهاب
https://github.com/aminkhani/Reinforcement-Learning
که تمام منابع خوب و مفید یادگیری تقویتی رو داخلش قرار دادم . و برای کسانی که میخاند وارد این حوزه بشند مفید خواهد بود
اگر هم فالو کنید بنده رو و اون ریپو رو استار⭐️ بدید خیلی خیلی ممنون میشم ، چون باعث دیده شدن میشه و بشه که بقییه هم ببینند و استفاده کنند
مرسی متشکر🌹🙏🏻
من یک ریپازیتوری ساختم در گیتهاب
https://github.com/aminkhani/Reinforcement-Learning
که تمام منابع خوب و مفید یادگیری تقویتی رو داخلش قرار دادم . و برای کسانی که میخاند وارد این حوزه بشند مفید خواهد بود
اگر هم فالو کنید بنده رو و اون ریپو رو استار⭐️ بدید خیلی خیلی ممنون میشم ، چون باعث دیده شدن میشه و بشه که بقییه هم ببینند و استفاده کنند
مرسی متشکر🌹🙏🏻
🐍 Python & Raspberry 🐍
✔️ فرض کنیم چنین سوالی داریم "میخوایم ببینیم، آیا حرف nام letters در کلمه nام words وجود داره یا نه" دو راه داریم که مشخص شدن. بدون ران کردن و تست سرعت کد، این خیلی مهمه، بگید کدوم کندتره؟ و برای جوابتون حتما دلیل بتراشید [خط سوم (choice) درست هست]…
✔️ جواب
تا حالا تریسبک دیدید؟ خب معلومه! اما این چه ربطی به جواب داره؟
اول بیاید یه تریسبک ببینیم:
هر یه دونه خطی که نوشته فلان فایل و کجا و یه خطی ازش آورده، چیزیه به اسم frame object.
هر تابعی که صدا زده میشه، توی call stack عه پایتون، یه فریم آبجکت درست میشه که استک مورد نیاز و دیکشنری ()locals عه اون و مقداری که ازش باید return بشه یا exception عی که باید ازش propagate بشه رو مدیریت میکنه، و تابع اون تو ران میشه.
یعنی return کار میکنه چون فریم آبجکت وجود داره و اون این کار رو برامون انجام میده.
وقتی پایتون یه مقداری رو به فریم دیگه ریترن میکنه، اون فریم باید از بین بره و gc و پایتون اینجا درگیرن، بساز خراب کن بساز خراب کن (که این توی توابع recursive اندکی فرق میکنه، هی فریم ساخته میشه روی هم توی استک و بعدش دونه دونه خراب میشن)
از اون طرف صدا زده شدن تابع و همین ساخته شدن فریم و اینا تبعا یه overhead عی داره و اصطلاحا function call، اندکی توی پایتون expensive هست (که البته توی پایتون ۳.۱۱ خیلی بهتر شده و تا ۳.۱۵ خیلی بهتر میشه)
روش اولی که توی صورت سوال هست، اگه گفتید چند تا تابع داره؟
1.
2.
+ 500
یعنی ۵۰۲ تا فانکشن کال رو فقط ما داریم میبینیم.
این همهههههههه فانکشن کال اتفاق میوفته
اما روش دوم
ما دو تا تابع میبینیم:
1.
2.
(اگه نمیدونستید باید بگم که لیست کامپریهنشن ها به یه تابع تبدیل میشن.)
توابعی هم که ما نمیبینیم، در جفت مثالها داندر
https://github.com/python/cpython/blob/75a6441718dcbc65d993c9544e67e25bef120e82/Objects/unicodeobject.c#L10627
با یه حساب سر انگشتی:
اولی یه لیست و یه مپ و ۵۰۰ تا لامبدا و ۵۰۰ تا متد contains
و دومی یه لیست کامپریهنشن و یه زیپ و ۵۰۰ تا متد contains
و اگه موارد مشترک رو کم کنیم
اولی -> 502
دومی -> 2 تا
و این میشه که روش اول کندتر میشه 😁
#M4hdi
〰〰〰〰〰〰〰〰〰
©@raspberry_python
تا حالا تریسبک دیدید؟ خب معلومه! اما این چه ربطی به جواب داره؟
اول بیاید یه تریسبک ببینیم:
Traceback (most recent call last):
File "/.../fields.py", line 241, in set
inst.data[self.name] = self.validator.validate(value)
File "/.../fields.py", line 662, in validate
raise ValidationError(messages=error_messages)
typesystem.base.ValidationError: {0: 'Must be a string.', 1: 'Must be a string.'}
هر یه دونه خطی که نوشته فلان فایل و کجا و یه خطی ازش آورده، چیزیه به اسم frame object.
هر تابعی که صدا زده میشه، توی call stack عه پایتون، یه فریم آبجکت درست میشه که استک مورد نیاز و دیکشنری ()locals عه اون و مقداری که ازش باید return بشه یا exception عی که باید ازش propagate بشه رو مدیریت میکنه، و تابع اون تو ران میشه.
یعنی return کار میکنه چون فریم آبجکت وجود داره و اون این کار رو برامون انجام میده.
وقتی پایتون یه مقداری رو به فریم دیگه ریترن میکنه، اون فریم باید از بین بره و gc و پایتون اینجا درگیرن، بساز خراب کن بساز خراب کن (که این توی توابع recursive اندکی فرق میکنه، هی فریم ساخته میشه روی هم توی استک و بعدش دونه دونه خراب میشن)
از اون طرف صدا زده شدن تابع و همین ساخته شدن فریم و اینا تبعا یه overhead عی داره و اصطلاحا function call، اندکی توی پایتون expensive هست (که البته توی پایتون ۳.۱۱ خیلی بهتر شده و تا ۳.۱۵ خیلی بهتر میشه)
روش اولی که توی صورت سوال هست، اگه گفتید چند تا تابع داره؟
1.
list
2.
map
+ 500
lambda
یعنی ۵۰۲ تا فانکشن کال رو فقط ما داریم میبینیم.
این همهههههههه فانکشن کال اتفاق میوفته
اما روش دوم
ما دو تا تابع میبینیم:
1.
listcomp
2.
zip
(اگه نمیدونستید باید بگم که لیست کامپریهنشن ها به یه تابع تبدیل میشن.)
توابعی هم که ما نمیبینیم، در جفت مثالها داندر
contains
(اونجایی که l in w
داریم) صدا زده میشه که، این تابع C هست:https://github.com/python/cpython/blob/75a6441718dcbc65d993c9544e67e25bef120e82/Objects/unicodeobject.c#L10627
با یه حساب سر انگشتی:
اولی یه لیست و یه مپ و ۵۰۰ تا لامبدا و ۵۰۰ تا متد contains
و دومی یه لیست کامپریهنشن و یه زیپ و ۵۰۰ تا متد contains
و اگه موارد مشترک رو کم کنیم
اولی -> 502
دومی -> 2 تا
و این میشه که روش اول کندتر میشه 😁
#M4hdi
〰〰〰〰〰〰〰〰〰
©@raspberry_python
GitHub
cpython/Objects/unicodeobject.c at 75a6441718dcbc65d993c9544e67e25bef120e82 · python/cpython
The Python programming language. Contribute to python/cpython development by creating an account on GitHub.
Forwarded from Persian python (Mohammad)
سلام دوستان وقتتون بخیر
ویدیو پلی لیست آموزش برنامه نویسی شئ گرایی آپلود شد
قسمت 6
موضوع :
اضافه کردن عمگر های ریاضی ( - + * / )
کلاس مثل لیست بساز که بتونی با ایندکس دیتا بگیری
امیدوارم که مفید بوده باشه
میتونین از لینک زیر تماشا کنید
https://youtu.be/rTyLvH_WbdY
لینک گیت هاب :
https://github.com/persianpython/PythonObjectOriented
ویدیو پلی لیست آموزش برنامه نویسی شئ گرایی آپلود شد
قسمت 6
موضوع :
اضافه کردن عمگر های ریاضی ( - + * / )
کلاس مثل لیست بساز که بتونی با ایندکس دیتا بگیری
امیدوارم که مفید بوده باشه
میتونین از لینک زیر تماشا کنید
https://youtu.be/rTyLvH_WbdY
لینک گیت هاب :
https://github.com/persianpython/PythonObjectOriented
YouTube
آموزش برنامه نویسی شئ گرایی در پایتون مقدماتی تا پیشرفته ( قسمت ششم ) ( عملگر های ریاضی و getitem )
سلام به کانال یوتیوبی پرشین پایتون خوش آمدید
تو این پلی لیست سعی دارم که مباحث شئ گرایی رو از مقدماتی تا پیشرفته توضیح بدم
که شامل دوستانی که اصلا از شئ گرایی و کلاس ها اطلاعاتی ندارن هم میشه
در این پلی لیست بجز موارد شئ گرایی درمورد تمیز نویسی و اینکه چطور…
تو این پلی لیست سعی دارم که مباحث شئ گرایی رو از مقدماتی تا پیشرفته توضیح بدم
که شامل دوستانی که اصلا از شئ گرایی و کلاس ها اطلاعاتی ندارن هم میشه
در این پلی لیست بجز موارد شئ گرایی درمورد تمیز نویسی و اینکه چطور…
✔️ «همهچیز در پایتون آبجکت است»
همه این رو یبار هم که شده شنیدیم!
➰ ولی این عبارت در CPython و زبانی مثل C که مثل مثلا پایتون شئگرایی و ارثبری به اون صورت نداره، چطور پیادهسازی شده؟
➰ اصطلاحی مثل Duck typing در سطح کدهای C در CPython چطور اتفاق میوفته؟
➰ در پایهای ترین حالت آبجکتهای پایتون، چه چیزهای مشترکی دارن؟
➰ تایپ float و تایپ dict چجوری نوشته شدن با C؟
➰ چه تایپهایی در CPython نشانی از داشتن len دارند؟
➿ تابع len چگونه کار میکنه؟
➿ تابع len چرا چنین، کار میکنه؟
➿ پیچیدگی زمانی تابع len چگونه است؟
➰ تایپ list در CPython چطور نوشته شده است؟
روز یکشبه
ساعت ۷ عصر
اینجا
https://t.me/SEYED_BAX/1831
همه این رو یبار هم که شده شنیدیم!
➰ ولی این عبارت در CPython و زبانی مثل C که مثل مثلا پایتون شئگرایی و ارثبری به اون صورت نداره، چطور پیادهسازی شده؟
➰ اصطلاحی مثل Duck typing در سطح کدهای C در CPython چطور اتفاق میوفته؟
➰ در پایهای ترین حالت آبجکتهای پایتون، چه چیزهای مشترکی دارن؟
➰ تایپ float و تایپ dict چجوری نوشته شدن با C؟
➰ چه تایپهایی در CPython نشانی از داشتن len دارند؟
➿ تابع len چگونه کار میکنه؟
➿ تابع len چرا چنین، کار میکنه؟
➿ پیچیدگی زمانی تابع len چگونه است؟
➰ تایپ list در CPython چطور نوشته شده است؟
روز یکشبه
ساعت ۷ عصر
اینجا
https://t.me/SEYED_BAX/1831
Telegram
سید و رفقا (بزرگترین کامیونیتی سید های برنامه نویس ایران)
✔️ «همهچیز در پایتون آبجکت است»
همه این رو یبار هم که شده شنیدیم!
➰ ولی این عبارت در CPython و زبانی مثل C که مثل مثلا پایتون شئگرایی و ارثبری به اون صورت نداره، چطور پیادهسازی شده؟
➰ اصطلاحی مثل Duck typing در سطح کدهای C در CPython چطور اتفاق میوفته؟…
همه این رو یبار هم که شده شنیدیم!
➰ ولی این عبارت در CPython و زبانی مثل C که مثل مثلا پایتون شئگرایی و ارثبری به اون صورت نداره، چطور پیادهسازی شده؟
➰ اصطلاحی مثل Duck typing در سطح کدهای C در CPython چطور اتفاق میوفته؟…
Forwarded from AI & DSP (فرهاد ناصری زاده 🐍)
لینکداین ثبت نام در ۲۰ آموزش پرطرفدار در سال اخیر رو تا ۳۰ آگست رایگان کرده میتونید در یکی از اونها ثبت نام کنید ،تمامی دوره های لینکداین داری سرتیفیکیشن هستند دوره های آموزش پایتون،sql,powerbi,و دیجیتال مارکتینگ از جمله این آموزش ها هستند با دوستان خود به اشتراک بگذارید
https://www.linkedin.com/business/learning/blog/top-skills-and-courses/the-most-popular-linkedin-learning-courses
@raspberry_python
https://www.linkedin.com/business/learning/blog/top-skills-and-courses/the-most-popular-linkedin-learning-courses
@raspberry_python
Linkedin
The 20 Most Popular LinkedIn Learning Courses
If you're looking to grow your career, you may want to check out one of the 20 most popular LinkedIn Learning courses of the year.
Forwarded from Persian python (Mohammad)
#تمرین_شئ_گرایی
تمرین چهارم
1. یک کلاس بسازید به اسم Vector
که 3تا آرگیومنت x, y ,z داشته باشه
بدون مقدار Default
2. تابع repr باید به طوری نوشته بشه که یوزر بتونه ازش برای باز سازی آبجکت استفاده کنه
( Reconstruct the instance )
3. باید اندازه بردار رو حساب کنیم
برای محاسبه بردار نیازه که شما جذر جمع توان 2 هر نقطه رو حساب کنید
امکان ضرب یک عدد int و float با vector داشته باشه
5. تمامی عملگر های منطقی رو ساپورت کنه
بر اساس
7. در تابع bool وقتی اندازه بردار 0 بود False برگردونه
8. و در آخر کلاس باید این اجازه رو به کاربر بده تا از طریق براکت بتونه نقاط رو بدست بیاره
جواب این سوال در گیت هاب قرار گرفته است
https://github.com/persianpython/PythonObjectOriented
تمرین چهارم
1. یک کلاس بسازید به اسم Vector
که 3تا آرگیومنت x, y ,z داشته باشه
بدون مقدار Default
2. تابع repr باید به طوری نوشته بشه که یوزر بتونه ازش برای باز سازی آبجکت استفاده کنه
( Reconstruct the instance )
3. باید اندازه بردار رو حساب کنیم
برای محاسبه بردار نیازه که شما جذر جمع توان 2 هر نقطه رو حساب کنید
from math import sqrtوقتی از تابع abs روی آبجکت استفاده میکنیم اندازه بردار رو برگردونه
sqrt( x **2 + y **2 + z **2 )
__abs__4. امکان جمع دو Vector باهم داشته باشه
امکان ضرب یک عدد int و float با vector داشته باشه
5. تمامی عملگر های منطقی رو ساپورت کنه
بر اساس
abs(Vector)6. قابلیت hash شدن رو داشته باشه
7. در تابع bool وقتی اندازه بردار 0 بود False برگردونه
8. و در آخر کلاس باید این اجازه رو به کاربر بده تا از طریق براکت بتونه نقاط رو بدست بیاره
v['y']بزرگ و کوچک هر2 رو باید ساپورت کنه...
v['Y']
جواب این سوال در گیت هاب قرار گرفته است
https://github.com/persianpython/PythonObjectOriented
GitHub
GitHub - persianpython/PythonObjectOriented: آموزش برنامه نویسی شئ گرایی در پایتون
آموزش برنامه نویسی شئ گرایی در پایتون. Contribute to persianpython/PythonObjectOriented development by creating an account on GitHub.
🐍 Python & Raspberry 🐍
Photo
پاسخ و کمی توضیحات اضافه تر درباره سوال تستی:
یه کلاس ساخته شده به اسم Apple و توی لاین آخر بدون نمونه ساختن از کلاس، متد func "از روی کلاس" کال شده. این به این معناس که نیاز نیست که func حتما پارامتر self داشته باشه چون پارامتر اول با چیزی پر نمیشه (منظور از چیزی رفرنسی به نمونه ی ساخته شده هست)
خب با خط
Apple.func()
فانکشن func ران میشه. داخل این فانکشن زده شده:
global a
a = 1
یه نکته ای که باید بهش توجه کنید اینکه این خودش یک راه تعریف کردن متغیر global هست! ما معمولا از keyword عه global برای منظور دیگه ای استفاده میکردیم، یعنی متغیر ما توی global تعریف شده بود برای اینکه داخل فانکشن به همون اون متغیر اشاره کنیم میومدیم global ش میکردیم. ولی حتما نیاز نیست که متغیری باشه از قبل تو سطح ماژول یا همون namespace عه global ، بلکه همین دو خط تعریفش میکنه توی global. پس تا الان ما یه a توی global داریم.
حالا تو خط بعدی
Apple.func1
کال میشه این دفعه. همینجا یه سوال: چرا میشه به Apple دسترسی داشت ؟ چون فانکشن های داخل کلاس nested عه enclosing scope عه کلاسشون، در اینجا global هستن. دقت کنید nested عه کلاس نیستنا! nested عه ماژول هستن.
خب func1 کال شد... دوباره مثل func ، از روی کلاس کال شده پس b با رفرنسی به نمونه پر نمیشه با چیزی پر میشه که پاس داده شده بهش یعنی ۱۰. خب تا اینجا ۱۰ و داریم ولی اومده با a جمعش کرده. آیا مشکلی داره؟ نه نداره. گفتیم nested عه global هست namespace ش... توی global هم که a داریم پس از همون جا برمیداره و باهاش جمع میکنه و ۱۱ رو برمیگردونه.
حالا این عدد برگردونده شده کجا ذخیره میشه؟ هیچجا ! رو هوا از بین میره چون چیزی نگرفتتش. خروجی چش میشه ؟ None. اگه خب آخر fun به جای:
Apple.func1(10)
بود:
return Apple.func1(10)
اونوقت خروجی ۱۱ ما رو return میگرفت و تحویل caller عه خودش یعنی print میداد و ۱۱ چاپ میشد.
✒️ SorousH
یه کلاس ساخته شده به اسم Apple و توی لاین آخر بدون نمونه ساختن از کلاس، متد func "از روی کلاس" کال شده. این به این معناس که نیاز نیست که func حتما پارامتر self داشته باشه چون پارامتر اول با چیزی پر نمیشه (منظور از چیزی رفرنسی به نمونه ی ساخته شده هست)
خب با خط
Apple.func()
فانکشن func ران میشه. داخل این فانکشن زده شده:
global a
a = 1
یه نکته ای که باید بهش توجه کنید اینکه این خودش یک راه تعریف کردن متغیر global هست! ما معمولا از keyword عه global برای منظور دیگه ای استفاده میکردیم، یعنی متغیر ما توی global تعریف شده بود برای اینکه داخل فانکشن به همون اون متغیر اشاره کنیم میومدیم global ش میکردیم. ولی حتما نیاز نیست که متغیری باشه از قبل تو سطح ماژول یا همون namespace عه global ، بلکه همین دو خط تعریفش میکنه توی global. پس تا الان ما یه a توی global داریم.
حالا تو خط بعدی
Apple.func1
کال میشه این دفعه. همینجا یه سوال: چرا میشه به Apple دسترسی داشت ؟ چون فانکشن های داخل کلاس nested عه enclosing scope عه کلاسشون، در اینجا global هستن. دقت کنید nested عه کلاس نیستنا! nested عه ماژول هستن.
خب func1 کال شد... دوباره مثل func ، از روی کلاس کال شده پس b با رفرنسی به نمونه پر نمیشه با چیزی پر میشه که پاس داده شده بهش یعنی ۱۰. خب تا اینجا ۱۰ و داریم ولی اومده با a جمعش کرده. آیا مشکلی داره؟ نه نداره. گفتیم nested عه global هست namespace ش... توی global هم که a داریم پس از همون جا برمیداره و باهاش جمع میکنه و ۱۱ رو برمیگردونه.
حالا این عدد برگردونده شده کجا ذخیره میشه؟ هیچجا ! رو هوا از بین میره چون چیزی نگرفتتش. خروجی چش میشه ؟ None. اگه خب آخر fun به جای:
Apple.func1(10)
بود:
return Apple.func1(10)
اونوقت خروجی ۱۱ ما رو return میگرفت و تحویل caller عه خودش یعنی print میداد و ۱۱ چاپ میشد.
✒️ SorousH
✔️ 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 باعث میشه که سریعتر بشه به این چیزا میگن بهینهسازی
#M4hdi
〰️〰️〰️〰️〰️〰️〰️〰️〰️
©@raspberry_python
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 باعث میشه که سریعتر بشه به این چیزا میگن بهینهسازی
#M4hdi
〰️〰️〰️〰️〰️〰️〰️〰️〰️
©@raspberry_python