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

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

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

Admin: @Abbasi_ai
Download Telegram
تا ۳ ماه که فکر نمی‌کنم جز کد زدن و رسوندن خودم به جایی که دیشب بودم کاری داشته باشم 😂🤣

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

Understand deep learning (book with codes)

ولی کد از دست دادن، مرگ که نیست
نهایتاً مجبور میشم دوباره بشینم فکر کنم و بزنم (علمش رو که از دست ندادم)
خلاصه خیلی هم ناراحت نیستم واقعیتش.
👍374🗿2
داشتم با یکی از بچه‌ها چت میکردم
یادم انداخت (حدوداً) سری قبلی که این اتفاق برام افتاده بود
البته اون موقع
Bad sector
روی HDD بود تازه داشتم ‌پایتون یاد می‌گرفتم و همه کدهام رو روی پایتون بازنویسی کردم

الان دارم Rust یاد میگیرم.
😁22👏1👻1
این گذارش برای بچه‌های توسعه دهنده هوش مصنوعی و انتخاب توزیع جایگزین برای ubuntu :

Fedora 38
رو نصب کردم، مشکلات ubuntu رو اصلا نداشت، درایور تمام سخت‌افزارها رو به درستی نصب کرده بود (خیلی جای تعجب داشت، چون روی اوبونتو و ... همیشه شخصا اینکار رو میکردم، اونم نسخه کاستومایز شده)
و البته dual screen رو خیلی فوق‌العاده پشتیبانی میکرد

اما مشکلاتش برای کار ما:
متأسفانه تقریباً هر ورژن اصلی cuda فقط برای یک نسخه و ورژن از fedora اومده

11.8 --> fedora 35
12.0 --> fedora 36
12.2 --> fedora 37

و هیچکدوم بطور رسمی fedora 38 رو هم پشتیبانی نمی‌کنه که خب خوب نیست. (مشکل از LTS نبودن فدورا هست)

اما واقعاً فوق‌العاده بود و بیش از حد سریع.

Rocky Linux 9
با نسخه ۸ بسیار کار کرده بودم و عالی بود بخصوص روی سرور ورژن ۹ قطعاً بهتر خواهد بود (امیدوارم)
و چون بر اساس
RedHat
ساخته می‌شه خیالم کاملاً راحته که مشکلات آپدیت و ...
Ubuntu
رو نخواهد داشت (این پروژه جایگزین CentOS هست و توسط مدیران ارشد همون پروژه اداره میشه، در پاسخ به IBM و عدم حمایت از CentOS بعد از خرید Redhat)

در نهایت اگر با این مورد هم زه مشکل بخورم
Pop_OS!

خیلی سال پیش معرفی کردم و روش بودم، (چون طرفدار system76 بودم)
و حالا که پیشرفت زیادی داشته بهتر از ubuntu هم هست (بالاخره یک سرس چشم دیگه روی کدهای ubuntu و تست‌هاش هست دیگه) نهایت میرم سراغ این گزینه اگر هیچ چیز جواب نده
👍26🕊2
Python Hints
این گذارش برای بچه‌های توسعه دهنده هوش مصنوعی و انتخاب توزیع جایگزین برای ubuntu : Fedora 38 رو نصب کردم، مشکلات ubuntu رو اصلا نداشت، درایور تمام سخت‌افزارها رو به درستی نصب کرده بود (خیلی جای تعجب داشت، چون روی اوبونتو و ... همیشه شخصا اینکار رو میکردم،…
#موقت
در طول این پروسه چون فکر می‌کنم خیلی طولانی تر از آنچه که باید میشه (بخاطر چیزایی که در مورد
Nvidia - linux
و درگیریشون می‌دونیم)

ادامه بحث رو توی
@DevChaiChat
میذارم، الان توی این وضعیتم که خب
Ubuntu *.04
که دیگه stable نیست (سرچ کنید دلایلش میاد)

Fedora
هم که LTS نداره و اتفاقات اخیر
RedHat
حتی تصمیم رو خطری می‌کنه

RockyLinux
به تنهایی فوق‌العاده‌اس اما
Nvidia 3090
داره اذیت می‌کنه و نمی‌ذاره محیط‌های گرافیکی حتی موقت نمایش داده بشه (blank screen یا no reponse دارم)

یکی از بچه‌ها پیشنهاد داد
Rocky
رو نصب کنم بعد توی tty2 بیام nvidia رو نصب کنم و ...

نمی‌دونم چطوری میشه اوضاع باید تست کنم ولی احتمال زیاد میرم سمت Xfce و بعد باید دستی بشینم کانفیگ کنم.

پافشاریم روی Rocky برای این هست که ۱۰ سال پشتیبانی داره
و اگر همین بار اول درست کانفیگ بشه، دیگه نباید دردسر خاصی داشته باشم.
👍132
Opera browser

رو نصب کنید، علاوه بر ویژگی‌های خوبی که داره ( Adblock - Islands , ... )
که یک مرورگر فوق‌العاده سریع هست و ...
مثل
Microsoft Edge

یک هوش مصنوعی برای پاسخ به سوالات هم داره من چندین سوال رو ازش پرسیدم بسیار بهتر از
Edge
جواب داد، بهش میگم که بهم توصیه شده فلان ابزار روی توی
/usr/local
نصب کنم ولی می‌دونم جاش باید توی
/opt

باشه، برام تحلیل کرده چرا opt منطقی‌تر هست، البته خودش هم از اول opt رو پیشنهاد کرده بود.
👍24👎1👾1
این آخرین پست درباره موضوع لینوکس و ... هست (با توجه به اتفاقات اخیر)
ببخشید که کمی از بحث دور شدم؛ اما هدف داشتم
خیلی از بچه‌هایی که روی 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 رو می‌تونم تایید کنم.

سوال بحث یا ... اگر بود توی گروه بحث آزاد :
@DevChaiChat
👍2611🆒2👎1🗿1
اگر راجب چیزی اطلاعی نداریم
نه توضیح می‌دیم
نه تخصصی حرف می‌زنیم
نه شوخی می‌کنیم.


این اصول رو یادگرفتن از خود کد زدن هم مهمتر هست.
62👍287🗿3👏2
به طرز خیره کننده‌ای تعداد مشاغل
remote
برای پایتون و django با پرداخت دلاری مبالغ خوب توی چند هفته گذشته بالا رفته

حتماً یک سری بزنید (لینکدین)
جالبتر اینکه توی پایتون دیگه هوش مصنوعی و ... نیست
Senior Python Software Engineer
بسیار زیاد شده.

من هم که کرم مصاحبه رو دارم، چندتا مورد رو که مصاحبه دادم واقعاً سوالات بطور خیلی منطقی و درستی همون موضوعات
Software Engineering
هست، فارغ از هرگونه سوال درمورد
Framework
های معروف پایتون،
خیلی‌ها فهمیدند که کسی که core python رو بخوبی بلد باشه می‌تونه توی همون چندماه onboard و تسک‌های اولیه؛ فریمورک مورد نظر شرکت رو یاد بگیره

به امید روزی که توی ایران خودمون هم این موضوع جا افتاده بشه (هرجا که خودم مسئول باشم تمام تلاشم رو می‌کنم آدم‌هارو با میزان درک از core python استخدام کنم فریمورک رو همه می‌تونند زود یاد بگیرند)

یکی از خفن‌ترین مصاحبه‌ها سوالات الگوریتمش
2-3-4 Tree
بود که خب جزو مسائل سخت هست (حتی برای Senior Software Engineering که بسیار مصاحبه جذابی بود برای خودم).

پ.ن : منظورم از remote هم worldwide remote بود، که خب احتمال کار دادن به ایرانی‌ها توش بیشتر هست.
👍7221
line_profiler
نصب :
pip install line_profiler
این کد دقیقا همون کاری رو می‌کنه که مثال cProfile انجام میداد :
اگر تصویر رو نتونستید بخونید پست قبلی رو ببینید :

https://t.iss.one/pyHints/146

اما بالای هر تابع یک decorator جدید اضافه شده؛ از صحبت‌های قبلی ی وام بگیرم و اشاره کنم که line_profiler رو همه جا یا رو کل پروژه استفاده نمی‌کنیم بخصوص اینکه بسیار کند هم هست.
اول cProfile بعد توابع یا ... مشکوک رو میاریم داخل line_profile (درحد یادآوری گفتم اشاره کنم)

اسکریپت بالا رو ذخیره می‌کنیم و بعد دستور :
kernprof -l -v <script-name>.py
رو اجرا می‌کنیم که خب <script-name> اسمی هست که شما برای فایل پایتون خودتون انتخاب کردید.

همینجا هم اشاره کنم اگر -v رو توی دستور بالا فراموش کردید بزنید و کد خیلی طول می‌کشید خروجی بده غم غصه نداره (دیدم که میگم)
kernprof
خروجیش رو توی هر ۲ حالت توی همون دایرکتوری ذخیره می‌کنه ی فایل به اسم
<script-name>.py.lprof

می‌تونید بعدش دستور :
python -m line_profiler <script-name>.py.lprof

رو بزنید و خروجی بگیرید. ,و اما تفسیر خروجی
👍1711🌚1
توی خروجی به تعداد
@profile

هایی که نوشتید؛ خروجی خواهید داشت که کاملا از هم جدا هستند (توی مثال بالا Total time شروع نتیجه line_profiler رو نشان میده)

Timer unit 
باشه که جلوتر بگم چی هست ولی ۳ خط اول از اسم‌هاش مشخص هست :
Total time 
کل زمان اجرایی که تابع نیاز داشته.
File
اسم اسکریپت رو نشون میده (برای شرایطی که ماژول‌های/اسکریپت‌های تودرتو دارید)

Function
اسم تابع و اینکه از چه خطی توی اسکریپت شروع شده (file هم که میگه چه اسکریپتی)

توی خروجی یک جدول ۶ ستونی هم داریم :
Line #
یا همون line number خطی که کدهای مورد بحث داخلش هست

همینجا بپرم روی ستون آخر یعنی :
Line Contents
کدهای مورد بحث رو نمایش میده.
👍1531
Python Hints
توی خروجی به تعداد @profile هایی که نوشتید؛ خروجی خواهید داشت که کاملا از هم جدا هستند (توی مثال بالا Total time شروع نتیجه line_profiler رو نشان میده) Timer unit باشه که جلوتر بگم چی هست ولی ۳ خط اول از اسم‌هاش مشخص هست : Total time کل زمان اجرایی که…
.
Hits
نشون میده موقع اجرای اون تابع چندبار اون خط اجرا شده (مثلا به for های تو در تو نگاه کنید)

Time
میزان زمانی که طول کشیده تا اون خط کد اجرا بشه (واحدش Timer Unit هست) یعنی برای کد bubble_sort توی خط 5 که نوشته شده 1910.6 این رو نیاید ثانیه تفسیر کنید؛
1910.6 Timer unit 
طول کشیده که خود timer unit اینجا 1e-06 s هست (یعنی ۱ میکروثانیه)

Per Hit
گفتیم که Time زمان کل Hits هارو نشون میده اما اگر بخوایم بدونیم یک خط محاسباتی که داخل for loop نوشته شده چقدر طول کشیده اونوقت چطور باید متوجه شد ؟ این ستون دقیقا همین رو بهتون نشون میده

%Time
درصد زمان صرف شده روی این خط از کد نسبت به کل زمان صرف شده رو نشون میده (پس اول این ستون رو نگاه بندازید بهش و تفسیرش کنید)
👍1611
یک ساعت نوشتم کنسل زدم پاک شد :/ (متن آپدیت میشه)

این هم یک روش استفاده زا line_profiler هست که دیدم استفاده می‌شه برای اینکه نیاز نباشه از دستور kernprof -l -v استفاده کنید.
که خب قطعا من طرفدارش نیستم به دو دلیل :

۱- کدهای بیشتری لازمه؛ طبعا بعد از اتمام هم پاک کردنش دردسر بیشتری داره.
توی مورد decorator (قبلی) فقط کافی همون رو search & replace بزنید با هیچی

۲- خروجی profiling رو ذخیره نمی‌کنید با این روش (که قبلا گفتم حداقل دو نسخه دارید یکی قبل تغییر یکی بعد از تغییر)

حالا شاید بگید خودت گفتی اصولی اینه که line_profile بعد از cProfile اجرا بشه و خروجی cProfile رو هم داریم ذخیره می‌کنید پس نیازی نداریم دیگه ؟
نکته خوبیه ولی سطحی نبینیم :
من تا حالا پروژه‌ای رو ندیدم که با تفییر یک خط کد توی یک تابع optimize بشه و تمام پس نیاز میشه این فایل‌ها؛ نکته بعدی حجم خروجی line_profile چیزی نیست که بعد سر نداشتنش بخواهید با تیم سر اینکه چرا یک خط کد ناخواناتر شده بحث کنید (توی مثال بالا ۲۷۲ بایت هست)
👍1722🆒2
این یکی واقعاً جالبه، جایگزین
Flake8, isort, black, pyupgrade, ...

با سرعت خیلی بیشتر.

Ruff
که با Rust نوشته شده، و پروژه
Scipy, Pandas, FastApi, ...
هم سمتش رفتند.
🔥24👍511
چندروز پیش یکی از دوستان ازم کمک خواست روی بررسی جوابی که به سوال مصاحبه داده بود؛ سوال برای سطح
mid-level, senior
مطرح شده بود (ولی سطحش بالاتر از مدیور هست.)
ساده شده صورت مساله این بود :
اصل سوال بصورت توضیحات بخشی از یک پروژه بود که یادم نیست و شخص باید خودش تشخیص می‌داد چیکار کنه که من اون بخش رو هم توی ساده‌سازی گفتم دقیقا چی میخوام

پیاده‌سازی یک Ring Buffer در پایتون بطوریکه بجای استفاده از لیست‌ها از Circular Double Linked List استفاده کنید؛ (پیاده سازی هر ۲ مورد با خود کاربر هست)
این Circular Double Linked List شما باید یک ویژگی مهم رو داشته باشه :
پشتیبانی از اضافه کردن node ها با استفاده از ایندکس دهی منفی.


همیشه فکر میکردم سوالات سخت همواره از مباحث درخت و ... هست (نه چیزهای ساده مثل مورد بالا) اما جوری توی پروژه واقعی گنجانده شده بود؛ صورت مساله اصلی رو میگم. که تبدیلش به اینکه دقیقا خود مساله چی میخواد حدود ۲۰ دقیقه وقت گرفت.
کل جلسه مصاحبه ۲ ساعت بود.

چندتا راهنمایی :
Ring Buffer = Circular Queue
———
Circular Double Linked List

رو باید اول پیاده‌سازی کنید؛ سریعترین راهکار اینه که اول linked list رو پیاده سازی کنید؛ بعد همین رو تبدیل به نسخه circular کنید بعد همین کد رو به double linked list تبدیل کنید و در نهایت توی متد insert ایندکس‌های منفی رو هم پشتیبانی کنید.

بعد از همین مورد برای Ring Buffer استفاده کنید (خیلی معقول بنظر نمیاد و دقیقا هم موضوع همین هست؛ قطعا چیزی که معقول نیست رو کتابی راجبش صحبت نکرده - شما هم روش تمرینی نداشتید)

واقعا بنظرم سوال پر چالشی بود و توی این مصاحبه می‌شد به راحتی :
۱- نحوه حل مسئله
۲- میزان تمرکز
۳- میزان دقت
۴- نحوه کد زدن
۵- سواد پایتون
۶- سواد ساختمان داده و الگوریتم
۷- کنترل فشار عصبی و ...
رو تماما امتیاز‌دهی کرد؛ بسیار سوال هوشمندانه و زیرکانه‌ای بود بنظر من برای همین خواستم با شما هم به اشتراک بذارم (البته یک سری شرط‌ها و شرایط خاص هم داشت که من از اون‌ها گذشتم که خیلی طولانی نشه متن)
👍3041
Python Hints
چندروز پیش یکی از دوستان ازم کمک خواست روی بررسی جوابی که به سوال مصاحبه داده بود؛ سوال برای سطح mid-level, senior مطرح شده بود (ولی سطحش بالاتر از مدیور هست.) ساده شده صورت مساله این بود : اصل سوال بصورت توضیحات بخشی از یک پروژه بود که یادم نیست و شخص باید…
اضافه کردن node با ایندکس منفی
۱- چیزی که پیاده‌سازی نکنم رو راجبش پست نمیذارم (البته منم مثل شرایط مصاحبه همون لحظه کد زدم)

۲- یک راهنمایی دیگه؛ حتما len رو پیاده سازی کنید برای
Overflow (Ring buffer)
بهش نیاز دارید

۳- اگر کمکی لازم بود توی پیاده سازی حتما بپرسید (خوشحال میشم بتونم کمک کنم)
13👍7
متن این تصویر نصف ایران رو بدبخت کرده
نصف دیگه هم که نکرده، تو عمرشون برنامه‌نویس نبودند.

برنامه‌نویس سرمایه گذار شرکت شما نیست، به اندازه شما مطمئن به کار و ایده شما برای پیشرفت نیست (توی بهترین حالت اگر شما ۱۰۰٪ مطمئن از پیشرفت هستید برنامه‌نویس باید روی ۶۰-۷۰٪ بشینه بیش از اینش توهم و حرف هست)

این حق هر برنامه‌نویسی هست که موقع همکاری با شما با هرجایی که فکر می‌کنه بهتر هست و به پیشرفتش بیشتر کمک می‌کنه مصاحبه بده.

حتی اگر پیشرفتی هم نباشه براش و هم سطح کار شما باشه، برنده شرکتی هست که مزایا + برخورد بهتر + امنیت فکری بیشتری رو به نیرو ارائه میده

به همه‌ی برنامه‌نویس ها هم باید بگم :
قبل از جابجایی مطمئن بشید ۲ بار فکر می‌کنید، جابجایی توی بهترین حالت هم همیشه ۱۰-۲۰٪ ریسک هست

اما پایندی به شرکتی لطف شما هست نه وظیفه شما.

پ.ن : این تصاویر هوشمندانه انتخاب میشه‌ها، ارتباط شما با شرکت رو مثل روابط عاطفی و خانوادگی نشون میده (اون جمله احمقانه، ماها یک خانواده هستیم هم همین بود)
البته رابطه عاطفی کاملاً یکطرفه، شما پایبند می‌مونید ولی شرکت به وقت بی‌نیازی شمارو اخراج می‌کنه
👍599
توی ادامه بحث profiling اینبار میرسیم به اهمیت حافظه؛ وقتی از یک تازه سنیور شده از پروفایلینگ بپرسید راجب cpu و ... صحبت می‌کنه از یک با تجربه بپرسید اهمیت مصرف حافظه در کنار زمان اجرا رو هم بهتون می‌گه
مثل منم باشید profiling GPU رو هم گذارش میدید (البته به قدرت قبلی‌ها نیست ولی از نداشتنش بهتره)
برای پروفایلینگ مموری معمولا از کتابخونه
memory_profiler
استفاده می‌شه ؛ اما حقیقتا شخصا ۶ ماه هست که جایگزین پیدا کردم و چقدر خوشحالم بابت این موضوع :
memray 
که تصویر بالا خروجی اجرای live هست واقعا پروردگار اطلاعات دقیق مصرف مموری هست.
دقت کنید مصرف مموری کتابخونه C, Rust, ... هم که ایمپورت کردید توی پروژه و داره استفاده می‌شه رو نشون میده که خیلی خیلی مهمه.
اما چطور ازش استفاده کنیم ؟
$ pip install memray


همینجا یک موضوع دیگه رو هم بگم (خودتون بخونید) یک پلاگین هم برای pytest داره که می‌توندی بعدا دنبال کنید
pytest-memray
25👍3❤‍🔥2
Python Hints
توی ادامه بحث profiling اینبار میرسیم به اهمیت حافظه؛ وقتی از یک تازه سنیور شده از پروفایلینگ بپرسید راجب cpu و ... صحبت می‌کنه از یک با تجربه بپرسید اهمیت مصرف حافظه در کنار زمان اجرا رو هم بهتون می‌گه مثل منم باشید profiling GPU رو هم گذارش میدید (البته…
ساده‌ترین راه اجرای memray استفاده از دستور run هست + flamegraph
همونطور که قبلا گفتم خروجی تمام پروفایلینگ‌هارو باید نگه دارید و نمودار لایو اینکار رو نمی‌کنه پس قبل از استفاده از نمودار لایو (حین اجرای برنامه تمام دستورات و مصرف مموری‌هارو نشون میده)
ازین دستورات استفاده کنید :

$ memray run <my-script>.py

بعد از اجرا یک فایل با پسوند bin برای شما ذخیره می‌شه که تمام اطلاعات مورد نیاز داخل همین فایل هست.

memray flamegraph <some-naming>.bin

بعد از اجرای دستور بالا یک فایل html برای شما ایجاد میشه که اگر با مرورگر باز کنید چیزی مشابه تصویر بالا خواهید داشت. تنها نکته‌ای که راجب این تصویر لازمه بگم بخش stats هست که
peak memory usage
(بیشترین مصرف مموری در طول اجرای کد) رو بهتون نشون میده.
باقی موارد به ازای هر خط کد یا import , .... مصرف مموری رو نشون میده (مثال من شاید خیلی خوب نباشه)


پ.ن: همیشه فایل .html رو همراه با .bin روی سیستم خودتون خروجی بگیرید و نگهدارید.
توی پست‌های بعدی می‌گم چرا .
1911
Python Hints
ساده‌ترین راه اجرای memray استفاده از دستور run هست + flamegraph همونطور که قبلا گفتم خروجی تمام پروفایلینگ‌هارو باید نگه دارید و نمودار لایو اینکار رو نمی‌کنه پس قبل از استفاده از نمودار لایو (حین اجرای برنامه تمام دستورات و مصرف مموری‌هارو نشون میده) ازین…
دستور run چندتا option هم داره که هرکدوم توی شرایط خاص استفاده می‌شه :

memray run --native <my-script>.py

این حالت برای وقتایی هست که می‌خواید اثبات کنید numpy, pandas , ... هستند که دارند ازین میزان رم استفاده می‌کنند یا اینکه می‌خواهید بین توابع مختلفی که پیکج‌ها ارائه می‌دهند مقایسه انجام بدید.
گرفتن ریپورت html روی این حالت می‌تونه طولانی باشه (جزو حالاتی هست که هم bin هم html بهتره روی یک سیستم خروجی گرفته بشه)

memray run --trace-python-allocators <my-script>.py

بجای گزارشات کلی که توی تغییر سایز memory pool گرفته می‌شه به ازای ایجاد و از بین رفتن هر آبجکت براتون گزارش مموری میده که باز هم خروجی خیلی کندتری خواهد داشت؛ و البته اطلاعات بسیار بیشتر.

memray run --follow-fork <my-script>.py


همونطور که از اسمش پیداس می‌گه اگر از parent process فورک گرفته شد وضعیت مموری اون child process رو هم توی ریپورت بیار.

از بین ۳ تا آپشن بالا توی این مدت شخصا فقط از native استفاده کردم چندبار (باقی موارد رو نیاز نداشتم)

اما دوتا آپشن دوست داشتنی دیگه هم وجود داره :
memray run --live <my-script>.py


همیشه بعد از اینکه دستور run رو اجرا کردم (ذخیره بشه) و بعد گزارش html رو آماده کردم؛ تا وقتی دارم روی memory optimization کار می‌کنم تنها دائما از live option استفاده می‌کنم

PID, Thread, Samples, Duration, Max heap size, current heap size
و ... رو بهم میده (برای current heap size) چون توی حالت لایو سریع تغییر می‌کنه از

time.sleep(10)
استفاده می‌کنم توی جایی که مشکوک هستم به میزان مصرف مموری و اینجوری ی پنجره ۱۰ ثانیه‌ای برای خودم باز می‌کنم تا دقیق بررسی کنم توی رم چه اتفاقی داره رخ میده.

memray run --live-remote <my-script>.py

هم همین کار رو می‌کنه اما گزارشات رو روی یک port خاص میفرسته (بازم من ازش استفاده نکردم)

memray run --live --native <my-script>.py

پر استفاده‌ترین حالت بعد از live option برای من استفاده ترکیبی از live و native هست (البته که حوصله آدم سر میره بعضی وقت‌ها تا گزارشش آماده بشه)

حتما برای کاستومایز کردن خروجی‌ها و بررسی دقیق‌تر داکیومنتش رو نگاه کنید (سعی کردم مهمترین مواردی که شخصا استفاده می‌کنم رو بگم فقط).
👍1481🌚1
برای دوستانی که بهونه سابقه کاری می‌آوردند
همونطور که تو جلسه رزومه نویسی گفتم، اگر یاد بگیرید و نکاتی که گفتم رو رعایت کنید، در حداقل حالت باید به مصاحبه دعوت بشید.

اینکه به این مرحله نمی‌رسید بخاطر سابقه کاری و ... نیست (پوزیشن جونیور)
بلکه بخاطر عدم توانایی شما در نوشتن رزومه هست.

پ.ن : از ایشان برای اشتراک گذاری تصویر اجازه گرفته شد.
👍29👏122🤪1
این فقط یک شوخی هست
ولی جامعه پایتون، جاوااسکریپت و .... همگی مدیون زبان‌های سطح پایین هستیم ♥️
😁36👍108🎃1