کاربرد واقعی از del

سلام خدمت دوستان
می خواستم یه مثال از کاربرد واقعی del برای حذف یک متغیر (int , float , str , bool)که توی پروژه واقعی اتفاق میوفته برام بزنید.
با del برای حذف ایتم از دیکشنری و لیست آشنا هستم فقط می خوام بدونم چه مواقعی پیش میاد که یه متغیر بخواهیم حذف کنیم.
ممنون :rose:

وقتی که به GC نتونیم اعتماد کنیم و کارمون رو راه نندازه و بخوایم خودمون وقتی مطمئنیم به یه متغیری نیاز نداریم، به صورت دستی از رم بندازیمش بیرون.

در کل سیستم gc تو پایتون رو دوست ندارم. (به طور خلاصه انگار یه process اضافه و تا حدودی احمق همیشه رو cpu هست که داره چک میکنه ببینه این متغیر ما جایی تو پایین کد رفرنس خورده یا نه، اگه نخورده، از رم خارجش کنه)

2 Likes

مگه GC توی پایتون کارش به خوبی انجام نمی ده که یه process اضافه و تا حدودی احمق خطاب می کنید یا اینکه مشکل خاصی مگه داره.

درمورد GC مطالعه ی زیادی نکردم ولی در کل به چیزی میگن که دیتای اضافه رو از رم پاک کنه و رم رو آزاد کنه.

مسلما بعضی زبونها اصلا gc ندارن و با کدهایی مثل free و del باید خودمون رم رو آزاد کنیم.
بعضی زبونها gc دارن، که چند مدل میتونه باشه. یکیش که پایتون اونجوریه، به این شکله که متغیرهایی که دیگه تا پایین برنامه قرار نیست استفاده بشن رو از heap میندازه بیرون.
پس یه نفر باید همیشه حواسش به متغیرها و call هایی که بهشون زده میشه باشه، وگرنه یا رم الکی مصرف میشه با برنامه ارور میده به علت پاک شدن اشتباه متغیر.
تنظیمات gc تو پایتون یه کم شله😅 چون بین این ذوتا اشکالی که الان گفتم، پر شدن رم خطر کمتری داره تا ارورهای احمقانه یا null یا دسترسی اشتباه به فشایی از رم که با دیتای جدید جایگزین شده!

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


اینکه از memory management پایتون خوشم نمیاد، مربوط به ۶ماه اخیر میشه که با #rust آشنا شدم😅
سیستم ownership که تو راسط وجود داره، احتمالا بهترین چیزیه که بشر میتونه بهش دست پیدا کنه😂
کلا gc نداره و نیازی بهش نداره. متغیری که از scope خارج بشه، از رم هم خارج میشه. یعنی تابع که تموم شد، موقع return کردن جواب، متغیرهای داخل تابع، از روی stack و heap پاک میشن.

2 Likes

با توجه به توضیحاتی که @pouya-abbassi عزیز در مورد GC دادن، فکر میکنم بیشتر باید وقتی از del استفاده کنیم که یه فضای زیاد اشغال شده (مثلا یه لیست بزرگ) و ما هم مطمئنیم دیگه از اون متغیر استفاده ای نداریم
و این رو ممکنه GC پایتون تشخیض نده چون ممکنه ما refrence داشته باشیم به اون لیست خیلی بزرگ اما خودمون میدونیم که با توجه به شرط ها و حلقه ها هیچ وقت نیازی بهش نیست و طبیعتا پایتون تا برنامه رو کامل run نکنه متوجه این موضوع نمیشه

2 Likes

چندوقت پیش یه پروژه زدم که نیاز داشت تعداد زیادی ریکوئست به یه api بزنه و نتیجه ی ریکوئستها رو بریزه تو دیتابیس.
هم با حلقه و هم با function call نوشتمش (و recursion هم که توی پایتون جواب نمیده اصلا) و در هر دو مورد بعد از حدود ۲۰،۰۰۰تا ریکوئست (فکر کنم این تعداد بود) ۱۶گیگ رم سیستم پر میشد و شروع میکرد به پر کردن swap.
خلاصه پایتون نمیفهمید که دیگه به دیتای قبلی نیاز نداره. منم نتونستم مشکلو حل کنم (حتی با del هم یه مقدار بیشتر از چیزی که باید، رم مصرف میکرد. کارم رو راه انداخت، ولی من نمیخواستم اینطوری باشه)
آخرش بیخیال شدم با کلوژر نوشتمش :innocent:

1 Like

در مقایسه با پایتون مصرف رم clojure چه طور بود؟
چون در مورد مصرف رم jvm هم زیاد ایده آل کار نمیکنه

https://docs.python.org/3/library/gc.html

در مورد gc شما این امکان رو دارید که این قابلیت رو فعال و یا غیر فعال کنید .

Garbage Collector interface

gc.enable()
gc.disable()
gc.isenabled()
gc.set_debug(flags)
gc.get_debug()
gc.get_objects()
gc.get_stats()
gc.get_count()
gc.get_threshold()
gc.get_referrers(*objs)
gc.is_tracked(obj)

برای من موردی پیش نیومده تا به حال نیاز به غیر فعال کردن gs و استفاده از متود های del() `remove()’ :roll_eyes:

3 Likes

اینطوری نمیشه گفت.
شما یه helloworld تو کلوژر بنویسید، به خاطر اینکه روی jvm اجرا میشه، ۲۰۰مگابایت حدودا رم مصرف میکنه. (مگر اینکه تو تنظیمات jvm بگیم فلان مقدار رم بهش اختصاص بده)

اینکه میگم رم کمتری مصرف کرد، به خاطر اینه کخ تا آخرین api که زدم، فکر کنم ۶۵۰۰۰تا ریکوئست و پردازش دیتا، همون ۲۰۰مگ رو مصرف کرد.
ممکن بود بشه کمترش هم کرد. ولی من دست به چیزی نزدم.

نمیشه گفت کدوم زبون بهتره، هر زبونی توی جتی خودش عالی عمل میکنه.

2 Likes