سلام
داشتم یه نکته ای رو در جایی میخوندم که دیدم جالبه و خواستم بگم. این نکته بهتون کمک میکنه در اکثر مواقع حجم استفاده برنامه شما از حافظه در چیزی حدود ۶۰ درصد کمتر بشه.
شما میدونید که وقتی دارید یک کلاس میسازید هر شی یه دیکشنری
نمونه این چنین کلاس ها:
در مقابل ما میتونم با
نمونه چنین کلاسی:
🔰تفاوت ها:
روش اول و حالت عادی
در این حالت نمونه ما کاملا پویا هستش و میتونیم ویژگی هایی بهش اضافه کنیم ولی حافظه بیشتری اشغال میکنه و همینطور جستجو کردن هم در ین مورد کندتر هستش
روش دوم و استفاده از slots
در این حالت نمونه ما پویا نیست و نمیشه بهش ویژگی اضافه کرد ولی از حافظه کمتری استفاده میکنه و همینطور سرعت جستجو بالاتر هستش. باید اضافه کنیم اگر ارث بری اتفاق افتاد و نیاز بود که کلاس فرزند ویژگی جدید داشته باشه باید slots خودش رو تعریف کنه
نکته: تفاوت حجم استفاده از حافظه در ساخت نمونه در تعداد پایین زیاد نیست و در این حالت پیشنهاد نمیکنم که از slots استفاده کنید ولی در ساخت تعداد نمونه زیاد برای مثال ۱۰۰۰۰ عددی این تفاوت کاملا حس میشه.
📊حالا بریم با یه اسکریپت تفاوت میزان فضای اشغالی این دو حالت رو در تعداد 100,000 عدد نمونه برسی کنیم.
امیدوارم براتون مفیده بوده باشه🙏😘
نظرات خودتون رو حتما کامنت کنید👌📝
#python #programing #memory_optimization #programming_tips #comma_code #comma_code_python
#پایتون #برنامه_نویسی #حافظه #بهینه_سازی #نکته #کاما_کد
📱 کانال تلگرام
📱 پیج اینستاگرام
📱 چنل یوتیوب
🔤 🔤 🔤 🔤 🔤 🔤 🔤 🔤 🔤
داشتم یه نکته ای رو در جایی میخوندم که دیدم جالبه و خواستم بگم. این نکته بهتون کمک میکنه در اکثر مواقع حجم استفاده برنامه شما از حافظه در چیزی حدود ۶۰ درصد کمتر بشه.
شما میدونید که وقتی دارید یک کلاس میسازید هر شی یه دیکشنری
__dict__ داره که ویژگی ها و مقادیر اون ویژگی ها رو نگهداری میکنه. باید بدونید این دیکشنری برای ساده ترین اشیا سربار حافظه قابل توجهی تولید میکنه .نمونه این چنین کلاس ها:
class N_user:
def __init__(self,name,age,loc):
self.name=name
self.age=age
self.loc=loc
در مقابل ما میتونم با
__slots__ پیشاپیش ویژگی ها رو اعلام کنیم تا برای هر شی یک ساختار آرایه ای در نظر گرفته بشه که فقط فضا برای نگهداری ویژگی هایی که تعریف کردیم رو داشته باشه.این کار باعث میشه سربار حافظه مربوط به دیکشنری کامل حذف بشهنمونه چنین کلاسی:
class S_user:
__slots__=["name","age","loc"]
def __init__(self,name,age,loc):
self.name=name
self.age=age
self.loc=loc
🔰تفاوت ها:
روش اول و حالت عادی
در این حالت نمونه ما کاملا پویا هستش و میتونیم ویژگی هایی بهش اضافه کنیم ولی حافظه بیشتری اشغال میکنه و همینطور جستجو کردن هم در ین مورد کندتر هستش
روش دوم و استفاده از slots
در این حالت نمونه ما پویا نیست و نمیشه بهش ویژگی اضافه کرد ولی از حافظه کمتری استفاده میکنه و همینطور سرعت جستجو بالاتر هستش. باید اضافه کنیم اگر ارث بری اتفاق افتاد و نیاز بود که کلاس فرزند ویژگی جدید داشته باشه باید slots خودش رو تعریف کنه
همچنین در این حالت اگر به قابلیت های خاص مثل dict یا weakref نیاز دارید میتونید اونها رو به slots اضافه کنید.نکته: تفاوت حجم استفاده از حافظه در ساخت نمونه در تعداد پایین زیاد نیست و در این حالت پیشنهاد نمیکنم که از slots استفاده کنید ولی در ساخت تعداد نمونه زیاد برای مثال ۱۰۰۰۰ عددی این تفاوت کاملا حس میشه.
📊حالا بریم با یه اسکریپت تفاوت میزان فضای اشغالی این دو حالت رو در تعداد 100,000 عدد نمونه برسی کنیم.
from sys import getsizeof as size
class N_user:
def __init__(self,name,age,loc):
self.name=name
self.age=age
self.loc=loc
def age_up(self):
self.age+=1
class S_user:
__slots__=["name","age","loc"]
def __init__(self,name,age,loc):
self.name=name
self.age=age
self.loc=loc
def age_up(self):
self.age+=1
range=range(100000)
N_users=[N_user("name",10,(10,10)) for _ in range]
S_users=[S_user("name",10,(10,10)) for _ in range]
n_memory=sum(size(i)+size(i.__dict__) for i in N_users)
s_memory=sum(size(i) for i in S_users)
print(f"n_users= {n_memory/1024/1024} MB")
print(f"s_users= {s_memory/1024/1024} MB")
print(f"frugality= {(1 - s_memory / n_memory) * 100:.1f}%")
امیدوارم براتون مفیده بوده باشه🙏
نظرات خودتون رو حتما کامنت کنید👌
#python #programing #memory_optimization #programming_tips #comma_code #comma_code_python
#پایتون #برنامه_نویسی #حافظه #بهینه_سازی #نکته #کاما_کد
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍3❤2