✔️دوره آموزش FastAPI به زبان فارسی
9️⃣2️⃣ قسمت بیست و نهم
https://youtu.be/AG0ROJyJE-g
#fastapi #آموزش
🆔 @PyFarsi
9️⃣2️⃣ قسمت بیست و نهم
https://youtu.be/AG0ROJyJE-g
#fastapi #آموزش
🆔 @PyFarsi
YouTube
آموزش Api نویس با FastApi Python ( Instagram قسمت سوم پروژه )
سلام به کانال یوتیوبی پرشین پایتون خوش آمدید
FAST API
یک وب میکرو فریمورک پایتون هست که با شعار عملکرد بالا
(high performance)
، یادگیری آسان ، کد زنی سریع و آماده برای تولید توسط آقای سباستین رامیرز تولید شده
ویژگی های اصلی این فریمورک :
سرعت : عملکرد…
FAST API
یک وب میکرو فریمورک پایتون هست که با شعار عملکرد بالا
(high performance)
، یادگیری آسان ، کد زنی سریع و آماده برای تولید توسط آقای سباستین رامیرز تولید شده
ویژگی های اصلی این فریمورک :
سرعت : عملکرد…
همه ی ما میدونیم که نوشتن regex در پایتون یکم مشکله (فارغ از بقیه ی زبان ها) و ممکنه شما یک الگو طولانی بنویسی و بعد از چند ساعت یا چند روز که بری یسری تغییرات داخلش بدی برات ناخوانا باشه
خب ما اینم میدونیم که پایتون شعارش سادگی عه، regex پایتون هم اینقدر سریعه، یعنی راهی نیست که بشه از این regex سریع و قوی راحتتر استفاده کرد؟
چرا البته که هست، اینم راهش:
https://vrgl.ir/LTDKa
خب ما اینم میدونیم که پایتون شعارش سادگی عه، regex پایتون هم اینقدر سریعه، یعنی راهی نیست که بشه از این regex سریع و قوی راحتتر استفاده کرد؟
چرا البته که هست، اینم راهش:
https://vrgl.ir/LTDKa
🚀 بازنویسی ربات اجرای کد با زبان گولنگ
به منظورت افزایش سرعت و انجام همزمان چندین درخواست در لحظه توسط ربات, کدهای ربات بازنویسی و به زبان گو منتقل شد.
@TelCompilerBot
امکان استفاده از ربات در گروه های دیگر یا پی وی ربات آزاد شد.
@pyfarsi
به منظورت افزایش سرعت و انجام همزمان چندین درخواست در لحظه توسط ربات, کدهای ربات بازنویسی و به زبان گو منتقل شد.
@TelCompilerBot
امکان استفاده از ربات در گروه های دیگر یا پی وی ربات آزاد شد.
@pyfarsi
کمی مقدمه:
یکی از فرق های اصلی asyncio با threading این هست که اولی cooperative و دومی preemptive هست توی threading سیستم عامل با یه سری الگوریتم های خاص تصمیم میگیره کی، چه process یا thread ای رو در لحظه ران کنه و کی switch اتفاق بیفته(مثلا با کمک time slicing) . ولی توی asyncio ما میگیم! یعنی باید خود coroutine بگه کی آماده ی switch هست به خاطر همینم هست باید await داشته باشیم بین task ها. پس باهم cooperation انجام میدن coroutine ها و خودشون با yield کردن کنترل رو میدن به صورت خودکار بین instruction ها این اتفاق نمیفته و کل سیستم بلاک هست اونجا.
چرا اینو گفتیم؟ یکی از دوستان این سوال رو پرسید:
چرا با وجود اینکه await نداریم اون task هایی که داخل لیست ساختیم داره اجرا میشه و hola چاپ میشه؟
تابع run یه فانکشن کمکی و سطح بالا هست که خودش میاد یه event loop میسازه خودشم close ش میکنه و coroutine ای که بهش پاس دادیم و میده به run_until_complete. حالا این چیکار میکنه ؟ coroutine عه مارو تبدیل به Task میکنه (طبیعتا schedule هم میشه) و بعد میاد run_forever عه event loop رو کال میکنه. اون چیکار میکنه ؟ میاد run_once_ رو ران میکنه. رسیدیم به جایی که باید برسیم...
تابع run_once_ کارش اینکه یه دور کامل هرچی توی event loop هست رو ران میکنه! task هایی که به انتها برسن StopIteration میدن و در نتیجه done میشن.
دلیل اینکه اون task هایی که await نکردیم ولی ران شدن همینه.
حالا بعدش چه اتفاقی میفته ؟ task هایی ممکنه داشته باشیم که توشون await داشته باشه و تموم نشده باشن یا به عبارتی Pending شده باشن.
وقتی event loop داره تموم میشه میاد تمام task های pending رو cancel میکنه. اتفاقی که میفته اینکه ارور عه CancellationError داخل coroutine ها throw میشه. coroutine ها میتونن هندل کنن این ارور رو اگه نکنن Task این کارو میکنه برای شما و اون Future رو Cancel میکنه (دلیل اینکه این ارور رو نمیبینید اینه که هندل شده)
حالا همه ی حرف ها رو با کد زیر در نظر بگیرید:
نکته۲: این ها رفتار event loop ای هست که asyncio به صورت دیفالت ازش استفاده میکنه. اگه شما از event loop عه دیگه ای استفاده کنید کاملا این برمیگرده به نویسنده ی اون event loop که چجوری میخواد پیاده سازیش کنه. event loop ها تا زمانی که یه api ای رو رعایت کنن (متد های لازم abstract class شون رو پیاده کنن) میتونن استفاده بشن. پس همچنان safe ترین راه این هست که رو رفتار event loop حساب نکنید و چیزی که گارانتی هست یعنی await کردن coroutine ها برای دادن کنترل به event loop رو انجام بدید.
یکی از فرق های اصلی asyncio با threading این هست که اولی cooperative و دومی preemptive هست توی threading سیستم عامل با یه سری الگوریتم های خاص تصمیم میگیره کی، چه process یا thread ای رو در لحظه ران کنه و کی switch اتفاق بیفته(مثلا با کمک time slicing) . ولی توی asyncio ما میگیم! یعنی باید خود coroutine بگه کی آماده ی switch هست به خاطر همینم هست باید await داشته باشیم بین task ها. پس باهم cooperation انجام میدن coroutine ها و خودشون با yield کردن کنترل رو میدن به صورت خودکار بین instruction ها این اتفاق نمیفته و کل سیستم بلاک هست اونجا.
چرا اینو گفتیم؟ یکی از دوستان این سوال رو پرسید:
چرا با وجود اینکه await نداریم اون task هایی که داخل لیست ساختیم داره اجرا میشه و hola چاپ میشه؟
async def hola():
print("hola")
async def main():
tasks = [asyncio.create_task(hola()) for _ in range(3)]
asyncio.run(main())
حالا بشکافیمش:تابع run یه فانکشن کمکی و سطح بالا هست که خودش میاد یه event loop میسازه خودشم close ش میکنه و coroutine ای که بهش پاس دادیم و میده به run_until_complete. حالا این چیکار میکنه ؟ coroutine عه مارو تبدیل به Task میکنه (طبیعتا schedule هم میشه) و بعد میاد run_forever عه event loop رو کال میکنه. اون چیکار میکنه ؟ میاد run_once_ رو ران میکنه. رسیدیم به جایی که باید برسیم...
تابع run_once_ کارش اینکه یه دور کامل هرچی توی event loop هست رو ران میکنه! task هایی که به انتها برسن StopIteration میدن و در نتیجه done میشن.
دلیل اینکه اون task هایی که await نکردیم ولی ران شدن همینه.
حالا بعدش چه اتفاقی میفته ؟ task هایی ممکنه داشته باشیم که توشون await داشته باشه و تموم نشده باشن یا به عبارتی Pending شده باشن.
وقتی event loop داره تموم میشه میاد تمام task های pending رو cancel میکنه. اتفاقی که میفته اینکه ارور عه CancellationError داخل coroutine ها throw میشه. coroutine ها میتونن هندل کنن این ارور رو اگه نکنن Task این کارو میکنه برای شما و اون Future رو Cancel میکنه (دلیل اینکه این ارور رو نمیبینید اینه که هندل شده)
حالا همه ی حرف ها رو با کد زیر در نظر بگیرید:
async def hola():نکته ۱: همه ی فانکشن هایی که بالا گفتم خیلی کار های اضافه تری میکنن و صرفا ورژن خلاصه شدش بود
print("first line")
try:
await asyncio.sleep(1)
except asyncio.CancelledError:
print("hola, now cancelled.")
async def main():
print("main started")
tasks = [asyncio.create_task(hola()) for _ in range(3)]
print("main finished")
asyncio.run(main())
نکته۲: این ها رفتار event loop ای هست که asyncio به صورت دیفالت ازش استفاده میکنه. اگه شما از event loop عه دیگه ای استفاده کنید کاملا این برمیگرده به نویسنده ی اون event loop که چجوری میخواد پیاده سازیش کنه. event loop ها تا زمانی که یه api ای رو رعایت کنن (متد های لازم abstract class شون رو پیاده کنن) میتونن استفاده بشن. پس همچنان safe ترین راه این هست که رو رفتار event loop حساب نکنید و چیزی که گارانتی هست یعنی await کردن coroutine ها برای دادن کنترل به event loop رو انجام بدید.
✔️ فرض کنیم چنین سوالی داریم
"میخوایم ببینیم، آیا حرف nام letters در کلمه nام words وجود داره یا نه"
دو راه داریم که مشخص شدن.
بدون ران کردن و تست سرعت کد، این خیلی مهمه، بگید کدوم کندتره؟
و برای جوابتون حتما دلیل بتراشید
〰️〰️〰️〰️〰️〰️〰️
©@pyfarsi
"میخوایم ببینیم، آیا حرف nام letters در کلمه nام words وجود داره یا نه"
دو راه داریم که مشخص شدن.
بدون ران کردن و تست سرعت کد، این خیلی مهمه، بگید کدوم کندتره؟
و برای جوابتون حتما دلیل بتراشید
〰️〰️〰️〰️〰️〰️〰️
©@pyfarsi
بنیاد پایتون کاران فارسی
✔️ فرض کنیم چنین سوالی داریم "میخوایم ببینیم، آیا حرف nام letters در کلمه nام words وجود داره یا نه" دو راه داریم که مشخص شدن. بدون ران کردن و تست سرعت کد، این خیلی مهمه، بگید کدوم کندتره؟ و برای جوابتون حتما دلیل بتراشید 〰️〰️〰️〰️〰️〰️〰️ ©@pyfarsi
✔️ جواب
تا حالا تریسبک دیدید؟ خب معلومه! اما این چه ربطی به جواب داره؟
اول بیاید یه تریسبک ببینیم:
هر یه دونه خطی که نوشته فلان فایل و کجا و یه خطی ازش آورده، چیزیه به اسم 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 تا
و این میشه که روش اول کندتر میشه 😁
〰〰〰〰〰〰〰〰〰
©@pyfarsi
تا حالا تریسبک دیدید؟ خب معلومه! اما این چه ربطی به جواب داره؟
اول بیاید یه تریسبک ببینیم:
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 تا
و این میشه که روش اول کندتر میشه 😁
〰〰〰〰〰〰〰〰〰
©@pyfarsi
GitHub
cpython/Objects/unicodeobject.c at 75a6441718dcbc65d993c9544e67e25bef120e82 · python/cpython
The Python programming language. Contribute to python/cpython development by creating an account on GitHub.
✔️ «همهچیز در پایتون آبجکت است»
همه این رو یبار هم که شده شنیدیم!
➰ ولی این عبارت در CPython و زبانی مثل C که مثل مثلا پایتون شئگرایی و ارثبری به اون صورت نداره، چطور پیادهسازی شده؟
➰ اصطلاحی مثل Duck typing در سطح کدهای C در CPython چطور اتفاق میوفته؟
➰ در پایهای ترین حالت آبجکتهای پایتون، چه چیزهای مشترکی دارن؟
➰ تایپ float و تایپ dict چجوری نوشته شدن با C؟
➰ چه تایپهایی در CPython نشانی از داشتن len دارند؟
➿ تابع len چگونه کار میکنه؟
➿ تابع len چرا چنین، کار میکنه؟
➿ پیچیدگی زمانی تابع len چگونه است؟
➰ تایپ list در CPython چطور نوشته شده است؟
روز یکشبه
ساعت ۷ عصر
اینجا 👈 https://www.tg-me.com/SEYED_BAX?livestream
همه این رو یبار هم که شده شنیدیم!
➰ ولی این عبارت در CPython و زبانی مثل C که مثل مثلا پایتون شئگرایی و ارثبری به اون صورت نداره، چطور پیادهسازی شده؟
➰ اصطلاحی مثل Duck typing در سطح کدهای C در CPython چطور اتفاق میوفته؟
➰ در پایهای ترین حالت آبجکتهای پایتون، چه چیزهای مشترکی دارن؟
➰ تایپ float و تایپ dict چجوری نوشته شدن با C؟
➰ چه تایپهایی در CPython نشانی از داشتن len دارند؟
➿ تابع len چگونه کار میکنه؟
➿ تابع len چرا چنین، کار میکنه؟
➿ پیچیدگی زمانی تابع len چگونه است؟
➰ تایپ list در CPython چطور نوشته شده است؟
روز یکشبه
ساعت ۷ عصر
اینجا 👈 https://www.tg-me.com/SEYED_BAX?livestream
Forwarded from محمد خشنوا / برنامه نویسی (Seyed Mohammad Khoshnava)
Media is too big
VIEW IN TELEGRAM
✔️ «همهچیز در پایتون آبجکت است»
همه این رو یبار هم که شده شنیدیم!
➰ ولی این عبارت در CPython و زبانی مثل C که مثل مثلا پایتون شئگرایی و ارثبری به اون صورت نداره، چطور پیادهسازی شده؟
➰ اصطلاحی مثل Duck typing در سطح کدهای C در CPython چطور اتفاق میوفته؟
➰ در پایهای ترین حالت آبجکتهای پایتون، چه چیزهای مشترکی دارن؟
➰ تایپ float و تایپ dict چجوری نوشته شدن با C؟
➰ چه تایپهایی در CPython نشانی از داشتن len دارند؟
➿ تابع len چگونه کار میکنه؟
➿ تابع len چرا چنین، کار میکنه؟
➿ پیچیدگی زمانی تابع len چگونه است؟
➰ تایپ list در CPython چطور نوشته شده است؟
🎥 #live #آرشیو
🖥 @SEYED_BAX
همه این رو یبار هم که شده شنیدیم!
➰ ولی این عبارت در CPython و زبانی مثل C که مثل مثلا پایتون شئگرایی و ارثبری به اون صورت نداره، چطور پیادهسازی شده؟
➰ اصطلاحی مثل Duck typing در سطح کدهای C در CPython چطور اتفاق میوفته؟
➰ در پایهای ترین حالت آبجکتهای پایتون، چه چیزهای مشترکی دارن؟
➰ تایپ float و تایپ dict چجوری نوشته شدن با C؟
➰ چه تایپهایی در CPython نشانی از داشتن len دارند؟
➿ تابع len چگونه کار میکنه؟
➿ تابع len چرا چنین، کار میکنه؟
➿ پیچیدگی زمانی تابع len چگونه است؟
➰ تایپ list در CPython چطور نوشته شده است؟
🎥 #live #آرشیو
🖥 @SEYED_BAX
Forwarded from محمد خشنوا / برنامه نویسی (Seyed Mohammad Khoshnava)
PyObjectPresentation.html
1.2 MB
از این به بعد با پایتون، فلاتر کد بزنید!
جدیدا فریمورکی برای پایتون منتشر شده که کاری مشابه فلاتر میکنه برای آشنایی با این فریمورک به لینک زیر مراجعه کنید :
https://vrgl.ir/ie5sI
جدیدا فریمورکی برای پایتون منتشر شده که کاری مشابه فلاتر میکنه برای آشنایی با این فریمورک به لینک زیر مراجعه کنید :
https://vrgl.ir/ie5sI
✔️ 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 باعث میشه که سریعتر بشه به این چیزا میگن بهینهسازی
〰️〰️〰️〰️〰️〰️〰️〰️〰️
©@pyfarsi
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 باعث میشه که سریعتر بشه به این چیزا میگن بهینهسازی
〰️〰️〰️〰️〰️〰️〰️〰️〰️
©@pyfarsi
✔️ سوالها:
➖ چرا CPython رو با assembly نمینویسن؟
➖ چرا CPython رو مثل PyPy نمیکنن؟ یا چرا از PyPy بجای CPython استفاده نمیکنیم؟
✅ پاسخ سوال اول:
سوال اول: کد سی سریعتره یا کد اسمبلی؟
همه به من بگید ببینم، کامپایلرهای زبان سی از سورسکد C، چی تولید میکنن؟ خب حالت خییییلی پایه اینهکه از سورس C، کد اسمبلی تولید میکنن بعد با یه اسمبلر کد ماشینشون رو تحویل میدن.
اما حالت، هیچوقت حالت پایه نیست 😁
کاری که یه کامپایلر سی انجام میده اینه که یه خروجی خیلی efficient و کد اسمبلی خیلی سریع از اون سورسکد بیرون میکشه
این اصل ماجراست.
اینه که جواب سوال میشه کد سی در اکثر مواقع از کد اسمبلی hand written که دقیقا همون کار رو انجام میده سریعتره. این همه مغز و وقت صرف نوشتن کامپایلر کردن تا این بشه
تا این شده
این از این
سوال دوم: نوشتن کد سی آسونتره یا کد اسمبلی؟
سوال سوم: برای نوشتن یه برنامه خیلی ساده، کی سریعتر مینویسه یه C کار یا یه Assembly کار؟
سوال چهارم که جوابش هم میدونیم، کد کی سریعتره؟
تماما C برندهی ماجراست
پس فکر اینکه CPython رو با اسمبلی بنویسن سریعتر میشه رو بندازید بیرون.
به چند دلیل: سری دلایل اول -> همین دلایل بالا
سری دلایل دوم: بابا پایتون توی یه سری کارا کنده به هزار تا دلیل دیگه 😕 گیر ندید به سی یا اسمبلی
الان سورس PyPy که سرعت خیلی بیشتری از CPython توی خیلی جاها داره ببینید، پایتونه به ولله تقریبا بالای ۹۸ ۹۹ درصد پایتونه
پس مشکل جای دیگهست.
✅ پاسخ سوال دوم:
پیادهسازی CPython یک پیادهسازی general هست.
این خیلی معنیها داره
مثال: ببینید یه چیزی وجود داره به اسم numba
(برای مطالعه در مورد نامبا این مقالهام رو بخونید)
این یه JIT Compiler هست برای کارای عددی و محاسباتی دارای حلقههای زیاد
یکی از کارای jit ها همینه، چنین کدهایی رو سریع کنن اما آیا همه چنین کدهایی دارن؟ خیر
آیا تحمل اورهد و سنگینی JIT رو دارن؟ قطعا خیر
میدونید چقدر رم مصرف میکنن؟
برای یه راهحل مشابه بین پایتون و NodeJS، اون نسخهی NodeJS حدود ۴.۵ برابر بیشتر از پایتون رم مصرف کرده، صرفا بخاطر داشتن JIT.
جیتها start up رو هم کندتر میکنن
از اون طرف پایتون بعضی جاها از pypy سریعتره
مثلا یکیش وب
آقای Anthony shaw یه چند تا بنچمارک گرفتن با FastAPI و Uviloop و این دم و دستگاهها
توی همهشون pypy بسیار از CPython کندتر بوده و رم مصرفی خیلی بیشتری داشته
یه مشکل دیگه هم هست
پایپای به طور صد درصد با C extension moduleها اوکی نیست
فرض کن نتونی numpy استفاده کنی 🙂
پس هر چیزی رو بهرکاری ساختن
〰️〰️〰️〰️〰️〰️〰️〰️
©@pyfarsi
➖ چرا CPython رو با assembly نمینویسن؟
➖ چرا CPython رو مثل PyPy نمیکنن؟ یا چرا از PyPy بجای CPython استفاده نمیکنیم؟
✅ پاسخ سوال اول:
سوال اول: کد سی سریعتره یا کد اسمبلی؟
همه به من بگید ببینم، کامپایلرهای زبان سی از سورسکد C، چی تولید میکنن؟ خب حالت خییییلی پایه اینهکه از سورس C، کد اسمبلی تولید میکنن بعد با یه اسمبلر کد ماشینشون رو تحویل میدن.
اما حالت، هیچوقت حالت پایه نیست 😁
کاری که یه کامپایلر سی انجام میده اینه که یه خروجی خیلی efficient و کد اسمبلی خیلی سریع از اون سورسکد بیرون میکشه
این اصل ماجراست.
اینه که جواب سوال میشه کد سی در اکثر مواقع از کد اسمبلی hand written که دقیقا همون کار رو انجام میده سریعتره. این همه مغز و وقت صرف نوشتن کامپایلر کردن تا این بشه
تا این شده
این از این
سوال دوم: نوشتن کد سی آسونتره یا کد اسمبلی؟
سوال سوم: برای نوشتن یه برنامه خیلی ساده، کی سریعتر مینویسه یه C کار یا یه Assembly کار؟
سوال چهارم که جوابش هم میدونیم، کد کی سریعتره؟
تماما C برندهی ماجراست
پس فکر اینکه CPython رو با اسمبلی بنویسن سریعتر میشه رو بندازید بیرون.
به چند دلیل: سری دلایل اول -> همین دلایل بالا
سری دلایل دوم: بابا پایتون توی یه سری کارا کنده به هزار تا دلیل دیگه 😕 گیر ندید به سی یا اسمبلی
الان سورس PyPy که سرعت خیلی بیشتری از CPython توی خیلی جاها داره ببینید، پایتونه به ولله تقریبا بالای ۹۸ ۹۹ درصد پایتونه
پس مشکل جای دیگهست.
✅ پاسخ سوال دوم:
پیادهسازی CPython یک پیادهسازی general هست.
این خیلی معنیها داره
مثال: ببینید یه چیزی وجود داره به اسم numba
(برای مطالعه در مورد نامبا این مقالهام رو بخونید)
این یه JIT Compiler هست برای کارای عددی و محاسباتی دارای حلقههای زیاد
یکی از کارای jit ها همینه، چنین کدهایی رو سریع کنن اما آیا همه چنین کدهایی دارن؟ خیر
آیا تحمل اورهد و سنگینی JIT رو دارن؟ قطعا خیر
میدونید چقدر رم مصرف میکنن؟
برای یه راهحل مشابه بین پایتون و NodeJS، اون نسخهی NodeJS حدود ۴.۵ برابر بیشتر از پایتون رم مصرف کرده، صرفا بخاطر داشتن JIT.
جیتها start up رو هم کندتر میکنن
از اون طرف پایتون بعضی جاها از pypy سریعتره
مثلا یکیش وب
آقای Anthony shaw یه چند تا بنچمارک گرفتن با FastAPI و Uviloop و این دم و دستگاهها
توی همهشون pypy بسیار از CPython کندتر بوده و رم مصرفی خیلی بیشتری داشته
یه مشکل دیگه هم هست
پایپای به طور صد درصد با C extension moduleها اوکی نیست
فرض کن نتونی numpy استفاده کنی 🙂
پس هر چیزی رو بهرکاری ساختن
〰️〰️〰️〰️〰️〰️〰️〰️
©@pyfarsi
ویرگول
پایتون «بسیار» سریع است! - ویرگول
یکی نیست تکلیف ما رو روشن کنه بالاخره پایتون کنده یا تند؟ بیاید تا یکم صحبت کنیم!
✔️دوره آموزش FastAPI به زبان فارسی
0️⃣3️⃣ قسمت سی ام
https://youtu.be/poVMEc7-7Dk
#fastapi #آموزش
🆔 @PyFarsi
0️⃣3️⃣ قسمت سی ام
https://youtu.be/poVMEc7-7Dk
#fastapi #آموزش
🆔 @PyFarsi
YouTube
آموزش Api نویس با FastApi Python ( Instagram قسمت چهارم پروژه )
سلام به کانال یوتیوبی پرشین پایتون خوش آمدید
FAST API
یک وب میکرو فریمورک پایتون هست که با شعار عملکرد بالا
(high performance)
، یادگیری آسان ، کد زنی سریع و آماده برای تولید توسط آقای سباستین رامیرز تولید شده
ویژگی های اصلی این فریمورک :
سرعت : عملکرد…
FAST API
یک وب میکرو فریمورک پایتون هست که با شعار عملکرد بالا
(high performance)
، یادگیری آسان ، کد زنی سریع و آماده برای تولید توسط آقای سباستین رامیرز تولید شده
ویژگی های اصلی این فریمورک :
سرعت : عملکرد…
کی و چرا از Jupyter Notebook استفاده کنیم؟
به نظر من یکی از شاهکارهای تولید شده همین Jupyter Notebook (که برپایه ی Ipython هست) هست. خیلی خلاصه سعی میکنم به ویژگی هایی که داره اشاره کنم:
۱- مناسبترین گزینه برای زمانی که میخواید report ای به کسی یا جایی بفرستید یا جزوه نویسی کنید:
چون میتونید بین کد های پایتونیتون توضیحات بنویسید. اونم نه فقط تکست معمولی بلکه mardown و LaTeX و html و css و حتی چند کلاس آماده ی bootsrtap. چی بهتر از اینکه یه سری کد های پایتونی قابل اجرا همراه با توضیحات زیبا و رنگی در یک داکیومنت.
۲- از مهمترین ویژگی هاش اینکه cell cell ران میکنه کد هارو ولی به چه درد میخوره؟ فرض کنید شما یه کدی دارید مینویسید که درخواست میدید به URL ای و وقتی جوابش اومد یه کاری روش میکنید. اگه توی ماژول پایتونی بنویسید و توی کد هاتون ارور داشته باشید چی میشه؟ درستش میکنید و باید دوباره ران کنید اونوقت باید دوباره درخواست بزنید به اونجا. "وقت گیره"! یه مثال خیلی پرکاربرد تر دیگه، شما نیاز دارید تا یه محاسبات زمانبری و انجام بدید تا یه آرایه نامپای مثلا تشکیل بشه و حالا ازش یه استفاده کنید... دوباره همین داستان اگه ارور داشته باشید باز باید صبر کنید... به جاش میاید اون بخش setup قضیه رو توی یه cell انجام میدید دیگه همیشه داریدش توی رم. جلوتر فقط کد خودتونو ران میکنید.
۳- خب مثل باقی ادیتور ها سینتکس highlighting داره، با تب code completion داره. ارور هارو زیباتر نمایش میده.
۴- قابلیت نمایش plot های مختلف و dataframe های pandas رو به صورت جدولی داخل خودش داره.
۵- وقتی یه document ای نوشتید به کلی فرمت از جمله PDF, HTML, RST, و خود PY خروجی بگیرید مناسب برای ارائه یا به اشتراک گذاری. گزینه آخر یعنی حتی میتونید اونو به ماژول پایتونی خروجی بگیرید و همه چیزایی که نوشتید به عنوان توضیحات میشه comment داخل اون ماژول.
۶- میتونید از magic command های موجود تو ipython استفاده کنید که بعضیاش خیلی مفیدن. (همونا که با % یا %% شروع میشه) از اینجا چک کنید چیزای باحالی داره.
۷- میتونید توش دستورات شل رو هم وارد کنیدو خروجیشو کنار خروجی های پایتونی خودتون هم ببینید حتی اونارو تو کدتون استفاده کنید!!
files = !ls
الان files عه شما یه لیستی از تمام فایل های داخل دایرکتوریتون هست.
۸- میتونید امکاناتش رو با نصب nbextension ها گسترش هم بدید. مثلا code formatter و یا box عه suggestion و یا linter و ... این لینک یا این لینک رو برای نمونه ببینید.
________________________________________
اگه ویژگی خوب دیگه ای رو نگفتم بگید همچنین ضعف هاش رو هم بگید مثلا جاهایی که مناسب نیست استفاده شه. اولین جایی که مناسب نیست اینکه پروژه توش بزنید...چون برای اینکار نیست اصلا. مثلا برای اینکه از یه ipynb توی یه ipynb دیگه چیزی import کنید نمیتونید مستقیم بزنید
from A import B
باید کار اضافه تری انجام بدید.
ولی درکل تو جایی که میشه ازش استفاده کرد فوق العادس 👍🏻
به نظر من یکی از شاهکارهای تولید شده همین Jupyter Notebook (که برپایه ی Ipython هست) هست. خیلی خلاصه سعی میکنم به ویژگی هایی که داره اشاره کنم:
۱- مناسبترین گزینه برای زمانی که میخواید report ای به کسی یا جایی بفرستید یا جزوه نویسی کنید:
چون میتونید بین کد های پایتونیتون توضیحات بنویسید. اونم نه فقط تکست معمولی بلکه mardown و LaTeX و html و css و حتی چند کلاس آماده ی bootsrtap. چی بهتر از اینکه یه سری کد های پایتونی قابل اجرا همراه با توضیحات زیبا و رنگی در یک داکیومنت.
۲- از مهمترین ویژگی هاش اینکه cell cell ران میکنه کد هارو ولی به چه درد میخوره؟ فرض کنید شما یه کدی دارید مینویسید که درخواست میدید به URL ای و وقتی جوابش اومد یه کاری روش میکنید. اگه توی ماژول پایتونی بنویسید و توی کد هاتون ارور داشته باشید چی میشه؟ درستش میکنید و باید دوباره ران کنید اونوقت باید دوباره درخواست بزنید به اونجا. "وقت گیره"! یه مثال خیلی پرکاربرد تر دیگه، شما نیاز دارید تا یه محاسبات زمانبری و انجام بدید تا یه آرایه نامپای مثلا تشکیل بشه و حالا ازش یه استفاده کنید... دوباره همین داستان اگه ارور داشته باشید باز باید صبر کنید... به جاش میاید اون بخش setup قضیه رو توی یه cell انجام میدید دیگه همیشه داریدش توی رم. جلوتر فقط کد خودتونو ران میکنید.
۳- خب مثل باقی ادیتور ها سینتکس highlighting داره، با تب code completion داره. ارور هارو زیباتر نمایش میده.
۴- قابلیت نمایش plot های مختلف و dataframe های pandas رو به صورت جدولی داخل خودش داره.
۵- وقتی یه document ای نوشتید به کلی فرمت از جمله PDF, HTML, RST, و خود PY خروجی بگیرید مناسب برای ارائه یا به اشتراک گذاری. گزینه آخر یعنی حتی میتونید اونو به ماژول پایتونی خروجی بگیرید و همه چیزایی که نوشتید به عنوان توضیحات میشه comment داخل اون ماژول.
۶- میتونید از magic command های موجود تو ipython استفاده کنید که بعضیاش خیلی مفیدن. (همونا که با % یا %% شروع میشه) از اینجا چک کنید چیزای باحالی داره.
۷- میتونید توش دستورات شل رو هم وارد کنیدو خروجیشو کنار خروجی های پایتونی خودتون هم ببینید حتی اونارو تو کدتون استفاده کنید!!
files = !ls
الان files عه شما یه لیستی از تمام فایل های داخل دایرکتوریتون هست.
۸- میتونید امکاناتش رو با نصب nbextension ها گسترش هم بدید. مثلا code formatter و یا box عه suggestion و یا linter و ... این لینک یا این لینک رو برای نمونه ببینید.
________________________________________
اگه ویژگی خوب دیگه ای رو نگفتم بگید همچنین ضعف هاش رو هم بگید مثلا جاهایی که مناسب نیست استفاده شه. اولین جایی که مناسب نیست اینکه پروژه توش بزنید...چون برای اینکار نیست اصلا. مثلا برای اینکه از یه ipynb توی یه ipynb دیگه چیزی import کنید نمیتونید مستقیم بزنید
from A import B
باید کار اضافه تری انجام بدید.
ولی درکل تو جایی که میشه ازش استفاده کرد فوق العادس 👍🏻