Python Hints
8.62K subscribers
170 photos
11 videos
9 files
141 links
Python tips and tricks
The Good, Bad and the Ugly

توی این کانال فقط قرار هست در مورد core python صحبت کنیم.

این کانال یک بلاگ شخصی هست و پیرامون نظرات و چیزهایی که توی بیش از ۱۰ سال کد زدن یاد گرفتم (فقط برای کمک به دوستان تازه‌کار)

Admin: @Abbasi_ai
Download Telegram
Python Hints
#Quick من این اخطار‌ هارو همیشه زودتر به دوستان نزدیکم میگم گفتم ازین به بعد بعضی‌هاش رو اینجا هم بگم: اولین : asyncio رو هرچه زودتر یاد بگیرید، پترن‌ها و مفاهیم برنامه‌نویسی Async, Parallel, Concurent قبلتر تأکید زیادی روش نداشتم، اما دیر نیست (توی…
#Quick

برای دوستانی که تازه میخوان یاد بگیرند این موضوع رو خیلی مهمه که روی پایتون 3.9 به بعد تمرین کنید و یاد بگیرید این موضوع رو
برای همین کتابی که توی پست pin شده معرفی کردم رو فقط تایید می‌کنم نسخه پایتون اون کتاب 3.10 هست با تغییرات و باگ‌های رفع شده آموزش میده.
👍232👎1
#Quick
از پایتون درست استفاده کنید.

دلیل این اختلاف زمانی و حافظه رو دوستان به خوبی توی کامنت‌ها توضیح دادند پس دیگه من صحبت نمی‌کنم راجبش.

اما غیر از مورد اول :
x1 *= 2

که بهینه ترین حالت محاسبات و استفاده درست از numpy هست (وقتی میخواهید روی آرایه قبلی بنویسید) باقی موارد هر ۲ باعث خطا و terminate شدن کولب شدند.

شاید فکر کنید ۱ میلیارد عدد بزرگی هست :
۱- بستگی به موضوع داره ولی توی دنیای فعلی خیر واقعاً بزرگ نیست
۲- مدل LLAMA 2 (تلفظ : لاما) که چندروز پیش توسط meta معرفی شد کوچکترینش 7 میلیارد و بزرگترینش 70 میلیارد پارامتر داره.
۳- performance
رو همیشه باید توی بدترین حالات محاسبه کرد (برای همین Big O رو یاد گرفتیم)
❤‍🔥29👍20🤪53👎211👏1💘1
Python Hints
من محمد عباسی (@abbasi_ai) یک توسعه دهنده پایتون هستم با بیش از ۸ سال تجربه کار با پایتون (البته زمانی که دارم این پست رو می‌نویسم و باقی موارد تجربیاتم هم برای این کانال اهمیتی نداره) سعی می‌کنم نکاتی که فکر می‌کنم مهم هست تغییراتی که توی نسخه‌های اخیر…
#موقت
#Quick

دوستان من لینکدین رو هرروز چک نمی‌کنم مگر اینکه پیام یا کاری داشته باشم
اگر connect request فرستادید و طول کشید برای
Accept
کردن، عذرخواهی‌ می‌کنم 🌹

توی مواردی که نخوام accept بزنم (پروفایل مشخص نیست، از نظر شغلی‌ و ... به هم نمی‌خوریم مثلا مورد داشتیم طرف زده بود مشاور املاک، درخواست داده بود 😂) خودم reject می‌زنم. اما اگر ببینم بدون پاسخ نمی‌ذارم.

این مورد برای پیام‌های تلگرام هم صدق می‌کنه (اگر پیامی رو چندروز ندیدم یک پیام دیگه با متن up بفرستید که پیام بالا بیاد و ببینم)
👍19👌8🗿5🤪21
#Quick

این یکی از Django هست نسخه 3.2 به بعد (من فقط 3.2 و 4.2 رو تست کردم)

یکی از سرویس‌های شرکت رو چون جلوتر از
Sprint

بودم و بسیار بسیار شبیه یکی دیگه از سرویس‌هایی هست که خودم کد زده بودم بجای اینکه طبق معمول پیاده سازی کنم
Async
پیاده‌سازی کردم با اینکه فکر میکردم چون ORM هنوز async نشده و نباید خیلی کمک بزرگی بهم بکنه اما طبق خروجی profiler تقریباً ۲.۲ برابر request بیشتری رو دارم هندل می‌کنم با سخت‌افزار و کانفیگ یکسان.

دوستان یوتیوبر بنظرم، ازین دوره‌ها بسازید.

برای توسعه دهنده‌ها شاید الان خیلی چیز پر دردسری باشه نسبت به موارد دیگه که وجود داره و نیاز به
sync_to_async , ...

ولی قطعاً آینده Django به این سمت هست و برای درآمد بهتر در اون زمان، الان وقت شروع تمرین هست بنظرم
👍267👎1
#Quick

برای بالا بردن سرعت کدها اولین کاری که می‌کنید اینه که میرید
C
یاد میگیرید ؟

اشتباه نکنید، چیزی که قبل از اون نیاز دارید و ۹۹.۹٪ مشکلاتتون رو حل می‌کنه
Cython

(شاید یک آموزشی هم براش گذاشتم)

برای مثال توی پروژه اخیر، بجای یک سری از پردازش‌های مهم تصویر رو که با
numpy
پیاده سازی شده بود آوردیم روی
Cython (numpy)

زمان اجرا تمام پردازش‌ها قبل از این برای ۱ عکس توی بنچمارک ۵۳ ثانیه بود و بعد از تبدیل به Cython به حدوداً ۱ ثانیه رسید.

خیلی مهمه با همین ابزارهایی که در اختیارتون هست آشنا باشید و بتونید کار کنید.

پ.ن : کتاب بروزی نداریم برای این موضوع متأسفانه ولی یکی از بهترین منابع که یادم هستم (چندسال قبل خوندم؛ با یکی از دوستان)
Cython (A guide for python programmers) by Kurt W.Smith - O'Reilly
بود و البته داکیومنت خود
Cython

حتی یاد گیری مقدماتش هم می‌تونه تا ۴-۵ برابر کدهاتون رو سریعتر کنه
👍44🤯8👌41
Rust for Python developers
این یکی واقعاً جالبه، جایگزین Flake8, isort, black, pyupgrade, ... با سرعت خیلی بیشتر. Ruff که با Rust نوشته شده، و پروژه Scipy, Pandas, FastApi, ... هم سمتش رفتند.
#Quick

پست قبلی که گذاشتم راجب uv حقیقتا از اینجا متوجه پروژه شدم که تیم‌های
Data Engineering, Backend, Test
توافق کردند از
ruff
استفاده کنند، بخصوص که حالا دیگه vs-code extension هم براش وجود داره و خیلی راحت شده کار بچه‌ها گفتند ما هم بریم سراغش و منم دارم بررسی می‌کنم که نظراتم رو راجبش بدم، نسبت به تمام کانفیگ‌هایی که داریم.


تا اینجا که خیلی خوب پیش رفته (از صبح).
👍201
#Quick


نوشتن list اطراف هر تابع باید دوبار بهش فکر کنید. اگر اون تابع یک generator باشه شما دارید بدترین کار ممکن رو می‌کنید.

این مورد رو بین بچه‌های دیتاساینس و هوش خیلی زیاد می‌بینم و بین بچه‌های بکند هم وقتی دارند روی CSV, Json و یا Json-line کار می‌کنند.

موضوع فقط مصرف زیاد رم نیست؛ موضوع سرعت هم هست اگر قرار به تمیزکاری و پردازش هر نمونه دپتا یا خط به خط هست لطفا از generator ها به درستی استفاده کنید

مشکل دارن با ما؛ ما اینجا زحمت می‌کشیم generator می‌نویسیم بعد اینا سریع می‌ندازنش توی list

تصویر ی نمونه خیلی ساده برای مثال هست (زمان اجرا کامنت شده)
👍502👎1🐳1
Python Hints
لطفاً پیام‌های پین شده کانال رو بخونید 🌹 به لطف شما عزیزان, کانال قابلیت استوری گذاشتن داره و سعی می‌کنم ازین قابلیت برای معرفی کتاب‌ها استفاده کنم تا دوستان به راحتی بتونند کتاب‌ها رو پیدا کنند. همونطور که قبلاً گفتم، فقط و فقط کتاب‌هایی رو معرفی می‌کنم…
#quick_note

تعداد افرادی که از کانال‌های جنگو و هوش مصنوعی وارد این کانال شدند درحال افزایش هست

برای همین توی بخش معرفی کتاب‌ها و استوری ها ازین به بعد کتاب‌هایی غیر از Core Python رو هم اضافه می‌کنم.

معرفی کتاب که ضرری نداره (اما لطفا غیر از موضوع Core Python) توی گروه متصل به کانال صحبتی نشه

هر موضوع دیگری : @DevChaiChat

در نهایت؛ یادآوری کنم من فقط کتابی رو معرفی می‌کنم که شخصا خونده باشم و بنظرم ارزش معرفی داشته باشه



اضافه کنم :
تمامی کتاب‌های معرفی شده رو می‌تونید با کلیک روی اسم کانال و رفتن توی قسمت Posts ببینید.
6511👍11👏2😘2❤‍🔥1🫡1
#Quick

یک سری وقت‌ها هست که توی پروژه بنا به هر دلیلی نیاز هست که یک پوشه خالی داشته باشید و اون رو روی git هم بذارید.
اکثرا برای permission درست و ... دیدم این کار انجام میشه.

حالا مساله چیه ؟ هرکی برای خودش از یک استاندارد استفاده می‌کنه (همه موارد جواب میده)
۱- اونایی که توی Mac کد میزنند:
اضافه کردن فایل .DSStore (با همچین اسمی به پوشه خالی)
۲- بچه‌های Linux :
اضافه کردن یکم فایل با نام دلخواه و شروع با . بیشترین مورد : .ignore
۳- ویندوزی‌ها :
اضافه کردن یک فایل با پسوند txt

اما برای این کار یک قرارداد نانوشته مشترک بین همه برنامه‌نویس‌ها هست اونم؛ توی اون پوشه خالی یک فایل به اسم
.gitignore
بسازید (جدای از gitignore کل پروژه هست) و محتوای داخلش این خواهد بود:

*
!.gitignore


یعنی همه چیز داخل این پوشه رو برای git نادیده بگیر به غیر از .gitignore

ربطی به موارد advance نداشت ولی چون دیدم خیلی کم رعایت میشه گفتم پست بذارم.
👍594🤨2🤝21🙊1
#Quick

هارد‌هاتون رو تمیز کنید

1.6 TB

فضای خالی بدست اومد.


کاری که من کردم :
۱- کل فایل‌های روی ۳ تا هارد اصلیم رو بدست آوردم و توی یک csv شامل این ستون‌ها ریختم؛

اسم فایل، پسوند، مسیر، حجم فایل، تاریخ ایجاد


بعد اول بر اساس اسم
و بعد از اون بر اساس تاریخ مرتب کردم
حدود ۸۰۰ گیگ با همین وضعیت پاک شد.
دیتاهای duplicate نبودند ولی مثلاً بکاپ فایل‌ها بودند که خب با وجود اینکه توی تاریخ‌های بعدی نسخه آپدیتش رو گرفته بودم فراموش کرده بودم نسخه قبلی رو حذف کنم.

کد قبلی رو با multi-threading, ThreadPool زدم و کمتر از ۱ ثانیه اجرا شد.

۲- بعد از اون یک سری فایل‌ها بودند که مشکوک بودم duplicate باشند؛
پس با md5 شروع کردم hash کردن، از multi-process استفاده کردم، و اینجا هم حدود ۱۰۰ گیگ duplicate پیدا شد که بعد بررسی دیدم دقیقاً یکسان هستند و پاک شد.

۳- من همیشه توی کدهام، اسم virtualenv هارو .venv میذارم پس دنبال این‌ها هم گشتم + مدل‌های هوش مصنوعی با پسوندهای مختلف باقی موارد هم همگی برای این‌ها بود
دقیق بررسی نکردم ولی فکر کنم ۲۰۰ گیگ .venv داشتم (عادت دارم کل پوشه پروژه رو میفرستم روی هارد بکاپ)


خلاصه که کار خوبیه و تکنیک‌هایی هم که گفتم برای من خیلی جواب بود، شما هم دوست داشتید استفاده کنید

.

۹۰٪ کدهاشم دادم codestral برام نوشت و فقط مطمئن شدم پیاده‌سازی درست هست و اجرا کردم، اما دسترسی دیلیت بهش ندادم.
همرو دستی دیلیت کردم که این بخش یک مقدار زمانبر شد.


اضافه کنم:
برای آخر هفته یک auto indexer + notifier + web هم پیاده خواهم کرد که بهم یادآوری کنه بکاپ‌های قدیمی رو پاک کنم اگر بر اساس اسم مشابه بود (همچنین باقی فایلا)
یک مورد هم برای .venv اضافه کنم و در نهایت web endpoint رو هم بذارم قبل از اینکه چیزی رو برای چندمین بار دانلود کنم بتونم سرچ کنم که آیا دانلود شده روی سیستم دارم یا خیر
❤‍🔥38👍24🔥2👌21
Python Hints
#بسیار_مهم #خارج_از_بحث خواهشاً بیاید این مورد رو آنقدر به اشتراک بذاریم که همه رعایت کنند. چند وقت پیش دنبال یک نیروی React برای شرکت یکی از دوستان می‌گشتم، گفتم میرم لینکدین چندتا پروفایل open to work رو می‌بینم و درخواست رزومه میدم به اون‌هایی که بنظرم…
#Quick

اگر توی LinkedIn وضعیت خودتون رو به #OpenToWork تغییر می‌دید حتماً قبلش پروفایل و اطلاعات اصلی خودتون رو تکمیل کنید.
مهمترین موارد :

۱- لوکیشن (محل سکونت٫اقامت)
۲- توضیح مختصر در مورد خودتون، تجربیاتی که دارید
۳- اطلاعات سابقه کاری
۴- وضعیت تحصیل (دانشجو هستید یا خیر)
۵- مدارک و ....

توی این هفته، کلی پروفایل LinkedIn رو که Open2Work بودند بررسی کردم شاید بتونم بگم فقط ۳۰٪ بطور کامل تمام اطلاعات مهم رو درست و دقیق داشتند.

یادتون باشه اگر توی LinkedIn جویای کار هستید، اولین برخورد و آشنایی قبل از همکاری کارفرما٫مدیر٫نیروی منابع انسانی و ... با صفحه شخصی شما در LinkedIn خواهد بود.

باقی مواردی که مهم نیست ولی بودنش قطعا کمک می‌کنی :

۱- تصویر پروفایل (بهتره تصویر پارک و ... نگذارید.)
۲- تصویر بنر
۳- پست‌هایی که پین کردید
۴- پست‌هایی که لایک٫کامنت می‌کنید

بازم همون قانونی که توی رزومه نویسی گفتم،
نه خیلی رنگی و ... که انگار برای موقعیت شغلی دلقک شرکت کردید (عاشق دلقک هستم)
و نه خیلی مشکی و بدون چیزی که حوصله سر بر باشه
مثل یک ui/ux کار ببینید.
باید جوری باشه که طرف حداقل ۱۰ دقیقه وقت بذاره (ولی توی ۲ دقیقه اطلاعات مهم روزمه شمارو بخونه، شما تو چشمش فرو کنید.)

پروفایل من رو مرجع نکنید، من توی لینکدین دنبال کار نمی‌گردم، برای همین اصلا آپدیت نشده.


اضافه کنم :

لطفاً از ابزارهای رزومه سازی استفاده نکنید (مخصوصاً اینایی که همه‌جای روزمه شما اطلاعات سایت رو می‌نویسند)
نهایتاً اینکه
ازشون ایده بگیرید، قالب رو بسازید و بعد خودتون خروجی pdf بدون watermark رو بگیرید و ارسال کنید.
این موضوع خیلی مهم هست، و رعایت نکردنش نکته منفی بزرگی می‌تونه باشه برای کارجو.
👍4210😨1
#Quick

من این مشکل رو زیاد دیدم؛ بیش از حداقل 20% پروژه‌های خدماتی که دوستان روش کار می‌کنن. می‌بینم که Postgresql به معنای واقعی کلمه OverKill هست. مخصوصا وقتی Sqlite کار رو در میاره.

شاید به روی خودتون نیارید ولی خیلی از شما هم ازین پروژه‌ها دیدید دیگه.

خواستم هم اهمیت SQLite رو یادآوری کنم
هم بگم پروژه‌هایی مثل rqlite هم وجود داره‌ها


مثال:
کاری به درست و غلط بودن دیزاین و ... ندارم و بحثم فقط همین مورد Sqlite هست.
یک کدی رو دیدم؛ طرف یک سیستم verification جدا براش طراحی کرده بود و تمام پروژه‌هاشون ازین سرویس استفاده می‌کرد. فکر کنم این سرویس یا .net بود یا golang بعد بحث اصلی سر این بود که Postgres بذارند یا MsSql من درجا پیشنهاد SQlite رو دادم.
این دیتابیس خیلی اهمیت زیادی نداره؛ هر کد قراره نهایتا ۱۰ دقیقه valid باشه. در صورت پاک شدن هم طرف یکبار دیگه درخواست میده (که من تاحالا پاک شدن خود به خود توش ندیدم).

چرا می‌خواید شر درست کنید برای تیم devops, server, database, ...
خیلی ها مشکلشون این هست که اطلاعات ندارند (هیچ‌وقت هم جرات تجربه کردن نداشتند)؛ خود SQLite روی SSD طبق بنچمارک‌ها.
بیش از 500 هزار insert در ثانیه رو پشتیبانی می‌کنه و برای read هم این مورد به بیش از 1 میلیون میرسه و این مورد بدون config های پرفورمنسی هست که توی داکیومنت خودش ارائه شده.
روی NVMe هم چندسال قبل تست کردیم؛ اعداد بهتر هم میشه.

اضافه کنم :
اینم rqlite اگر حتی خواستید SQlite رو بصورت distributed داشته باشید (قبلا توی اون کی کانال راجبش صحبت کردم با K8s )
👍54👌543🍓1🗿1
#Quick

یک عادت خوبی که توی بچه‌های ایران هست که یک endpoint توی پروژه‌های بکند می‌سازند به اسم health-check اما ۹۰٪ اشتباه پیاده‌سازی میشه متأسفانه.

برای اونایی که نمی‌دونند، health-check برای این هست که بصورت اتوماتیک یک سیستم دیگه مثل k8s یا سیستم مانیتورینگ بتونه وضعیت بکند رو بررسی کنه و اگر جوابی نگرفت ایمیل بزنه یا اون pod رو ریست کنه.

حالا چرا میگم اشتباه پیاده‌سازی میشه، اول میرم سراغ مانیتورینگ:

فرض کن شما یک بکند داری که برای کار کردن به postgres, celery نیاز داره با این وضعیت سیستم شما وقتی سالم هست که به postgres شما بتونه یه درستی دسترسی بگیره و البته به celery (عملکرد celery, postgres رو اگر بخواید بررسی کنید نیاز به ۲ تا سیستم مانیتورینگ جدا دارید، برای شما توی سطح اپلیکیشن دسترسی به این سرویس‌ها مهم هست)

فکر کنم متوجه منظورم شدید؛ توی health-check باید دسترسی به سرویس‌هایی که بکند شما بدون اونا healthy نیست رو هم چک کنید.
توی مثال قبلی اگر celery برای شما اجبار نیست توی health-check کانکشن بهش رو تست نمی‌کنید.

حالا چرا k8s رو مثال زدم ؟ برای اینکه بگم استفاده از این endpoint برای بررسی pod ها کار درستی نیست:

هر pod بصورت جداگونه و بصورت تک سرویس در نظر گرفته میشه که به تنهایی می‌تونه restart بشه بدون اینکه به سیستم لطمه بزنه (من HA درنظرم گرفتم، k8s برای همینه دیگه) پس باید تو سریعتر زمانی که عملکرد خودش رو از دست میده restart بشه فکر کن load سیستم بره بالا در این شرایط هم از روی health-check نمی‌شه مطمئن بود آیا چون load شبکه رفت بالا جواب دیر میاد یا memory leakage داریم یا ...
پس سرویس رو از exception, ... مانیتور کنید با k8s تا جایی که می‌شه.
👍44123👎1
#Quick

اگر از vscode برای Rust استفاده می‌کنید حتما این extension رو نصب کنید که دستورات sql رو براتون وسط کدهای rs به خوبی highlight می‌کنه ( از حالت str& خالی در میاد)

الان اومد یک کدی رو بزنم چندتا از Sql Query هاش خیلی طولانی و سخت شد بدون highlight خوندنش قطعا آزار دهنده بود با سرچ به این رسیدم و بنظرم گزینه بسیار کمک کننده و عالی‌ای هست.
👍296🙏21🔥1
#Quick

مثالی برای یک بحث:

یک سری سوالات هست توی مصاحبه که واقعاً نیاز به درک درست از چندین جنبه داره.
یک مثال میزنم و بعدش دیگه این سوال رو از مصاحبه‌هام حذف می‌کنم :

مثلاً توی بکند؛
چرا به سریالایزر نیاز داریم ؟ من مدل دیتابیس رو دارم پکیج‌های مورد نیاز برای کار با json, dict هم که وجود داره چرا مستقیم خودم اینکار رو نکنم و حتماً باید از serializer‌ استفاده کنم ؟

این مثلاً ازون سوالاتی هست که اگر پوزیشن کاری جنگو باشه، توی سطح mid می‌پرسم.
اما اگر غیر از اون باشه حتماً توی سطح junior می‌پرسم، یک نمونه از چیزهایی که میگم بکند رو فارغ از فریمورک یادبگیرید هم هست.

به جوابش فکر کنید، اگر نمی‌دونید هم تحقیق کنید.
👍34🤔92
Python Hints
#Quick مثالی برای یک بحث: یک سری سوالات هست توی مصاحبه که واقعاً نیاز به درک درست از چندین جنبه داره. یک مثال میزنم و بعدش دیگه این سوال رو از مصاحبه‌هام حذف می‌کنم : مثلاً توی بکند؛ چرا به سریالایزر نیاز داریم ؟ من مدل دیتابیس رو دارم پکیج‌های مورد نیاز…
#Quick

یک سری پروژه داشتم نگاه میکردم، پروژه‌هایی که یا توی دوره‌های مختلف گذاشته شده (برای آموزش) یا بچه‌ها برای تمرین زدند.
(جلوتر میگم چرا اینکارو داشتم می‌کردم)

بعد می‌دیدم که خب هیچکدوم ازین پروژه‌ها مثلاً از ابزاری مثل Celery استفاده نکردن یا Celery داره ولی Flower نداره.

اول اینکه مگه توی دنیای فعلی میشه شما پروژه‌ای داشته باشی ولی celery توش نباشه؟ یا اینکه celery رو ببری روی پروداکشن ولی مانیتور نکنی (اینو توی خیلی پروژه‌ها هم دیدم).

یا یک مثال دیگه، هیچکدوم از پروژه‌ها رو نمی‌شد با تک کامند deploy کرد.
local, stage, production

بحث ci/cd نیست الان، ولی docker compose و ... باید به درستی نوشته بشه

و البته کلی نکات دیگه مثل این موضوع.

اینکه چرا دارم این موارد رو دنبال می‌کنم :

ضبط یک دوره کامل، اگر به نتیجه برسیم با یک تیم حرفه‌ای.
👍7721👎5❤‍🔥3🔥2
Python Hints
اومدم یک تولز معرفی کنم و برم : من حدودا ۲ سالی میشه که Postman ندارم؛ از وقتی که لاگین و Sync و ... کم کم اجباری شد (احمقانه) ی مدت طولانی رفتم روی کد پایتون؛ یک بخشی داشتم به اسم api client توی اکثر کدهام که خودش ی پروژه کنار پروژه اصلی میشه ( کارفرما و…
#Quick

و در نهایت :

استفاده از Insomnia, Postman توی شرکت برای پروژه‌های اصلی ممنوع شد.

بخاطر اینکه برای استفاده ازین ۲ ابزار حتماً باید اکانت داشته باشید و حتماً هم این ابزارها تمام اطلاعات رو با سرور‌هاشون Sync می‌کنند.

پیشنهاد خودشون Bruno بوده (پیشنهاد من بود) ولی هر ابزاری که بدون نیاز به اینترنت و sync بشه استفاده کرد مشکلی نداره.


پ.ن : اگر کسی گزینه بهتری می‌شناسه قطعاً منتظر شنیدنش هستم.
Thunder Client
هم درحال حاضر استفاده می‌کنم البته، ولی خب چندتا از دولوپر‌ها vscode ندارند که دردسر شده.
👍296👎3👏2🤔2
#Quick

داشتم پروژه django شرکت رو می‌خوندم یک مشکل داریم سر بعضی endpointها و برخی تسک‌ها.
اولین کاری کردم این بوده که یک سری دیتا تست با faker بهش دادم مثه loadtest ولی بدون ابزار و بعد هم profiling گرفتم و ذخیره کردم.
چیز جالبی که دیدم؛ پروژه موقع کار کردن با redis به مشکل میخورد.
ولی redis منابعش بیشتر از حد مورد نیازش بود.

حجم دیتاهای تست رو کم کردم و مشکل حل شد؛ توی چندتا تست مختلف که زدم دیدم مسئله و مشگل از سمت پیکج redis هست توی پایتون و راهکار ساده رو هم خود redis داده (هرچند من برعکس بهش رسیدم)

$ pip install "redis[hiredis]"


بجای اینکه برای parse کردن دیتا از python استفاده کنه وقتی hiredis رو نصب کنید از C استفاده می‌کنه (بنچمارکاش هم توی گیت‌هاب hiredis هست ببینید)

مشکل خیلی ساده حل شد؛ ولی برای این حل ساده خیلی زمان و درک profiling لازم بود.

اهمیت profiling
👍68🔥32🆒2
#Quick
سوال مصاحبه یکی از دوستان بوده.

توی مصاحبه خیلی از زبان‌های برنامه‌نویسی مختلف یکی از سوالاتی که پرسیده می‌شه مربوط به نحوه ارسال آرگومان به توابع هست اکثرا هم شما به یکی از دو حالت:

Pass by Value
Pass by Reference

اشاره می‌کنید؛ اما توی پایتون اینطوری نیست توی پایتون ما
Pass By Object Reference (Pass by Assignment)
رو داریم. اول برگردیم به این تعریف که:
همه چیز در پایتون نهایتا object هست.


وقتی یک آرگومان رو به تابع میدید؛ رفرنس اون آبجکت رو براش می‌فرستید و نه یک کپی از اون رو ولی این رفرنس رو بصورت pass by value می‌فرستید! گیج گننده شد؟ برای همین میگیم پایتون نه Pass By Reference هست نه Pass By Value

یک صندوق رو فرض کنید که توش وسایل شما قرار داره (این حکم object رو داره) حالا فرض کنید برای اینکه جاش رو یادتون نره آدرسش رو روی یک کاغذ نوشتید و توی جیبتون می‌ذارید (این میشه reference شما)
یکی از دوستانتون می‌خواد صندوق رو ببینه؛ شما فقط کافیه آدرس رو بهش بدید که برای اینکار شما آدرس رو روی یک کاغذ جدید می‌نویسید و اون رو بهش میدید (این میشه Pass reference by Value)

و این میشه مدل پایتون؛ اگر رفیق شما بره اونجا و از داخل صندوق چیزی برداره یا تغییراتی روی صندوق انجام بده؛ شما هم اون تغییرات رو خواهید دید. اگرم که صندوق رو ببینه و کارش که تموم شد کاغذ آدرس صندوق رو بندازه دور اونوقت صندوق هنوز سرجاش خواهد بود و شما صاحبش هستید.

اگر بره از صندوق یدونه بسازه؛ صندوق شما تغییری نمی‌کنه فقط یکی دیگه مشابهش وجود داره (که ممکنه چیزایی که داخلش هست فرق کنه)

مثال بالا میشه برای Object هایی که قابل تغییر هستند مثل list
اما اگر Object قابل تغییر نبود چی ؟ مثل Int
اونوقت رفیق شما هر تغییری که بخواد بده اول باید ی دونه از روی چیزی که مال شما هست برای خودش بسازه بعد تغییرش بده.


def demonstrate_passing_behavior(my_list, my_int):
print("\n--- INSIDE FUNCTION ---")
print(f"List ID: {id(my_list)}, Int ID: {id(my_int)}")

my_list.append(4)
print(f"List after append: {my_list}, ID(append): {id(my_list)}")

print("Copy of the original list")
my_list = list(my_list)
print(f"List copy and reassignment: {my_list}, ID(copy): {id(my_list)}")

print("Modifying integer...")
my_int = my_int + 10
print(f"Int after modification: {my_int}, ID(modified) : {id(my_int)}")


original_list = [1, 2, 3]
original_int = 5

print(f"Original list: {original_list}, ID: {id(original_list)}")
print(f"Original int: {original_int}, ID: {id(original_int)}")

demonstrate_passing_behavior(original_list, original_int)

print("\n--- AFTER FUNCTION CALL ---")
print(f"Original list: {original_list}, ID: {id(original_list)}")
print(f"Original int: {original_int}, ID: {id(original_int)}")
👍5323
چه تغییرات قشنگی داریم روی؛ PostgreSql 18 شماهم دیدید ؟
برای من سه موردش خیلی جذاب هست؛
اولیش بالاخره؛ Asynchronous I/O بله منم خوندم فعلا فقط روی Read ولی همینم خوبه ۲-۳ برابر سرعت بیشتر اونم مفتی کیه که بدش بیاد ؟

دومیش؛ پشتیبانی کامل از UUIDv7 یعنی بدون دردسر می‌تونی حتی روی distributed system هم primary key کاملا یونیک داشته باشی.
تازه اگر پست‌های قبلی رو دنبال کرده باشید می‌دونید UUIDv7 برای ایندکس هم عملکرد بهتری داره (مشکلی که خیلی از پروژه‌ها با UUIDv4 داشتند و حالا تقریبا حل شده)

نهایتا یک سری Optimization های خاص که بصورت اتومات کوئری شما رو قبل از اجرا بهبود میده مثلا اگر OR زیاد باشه و بشه با Any تغییرش میده و ...


و یک اشاره هم بکنم به این پست (حدودا همین موقع‌ها ۲ سال پیش):
https://t.me/pyHints/117
هنوزم دیر نشده؛ وقت بذارید براش و درکش کنید!


پ.ن؛
از دوستان اشاره کردند، created_at هم اگر یادمون بره به چخ نمی‌ریم 😁
شوخی خوبی بود، اگر نگرفتید:
بخاطر این هست که UUIDv7 بر اساس زمان هست
🔥27👍3