برنامه نویسی

استفاده از __slots__ برای عملکرد بهتر در کلاس های پایتون

Summarize this content to 400 words in Persian Lang
هر بار که ما یک کلاس جدید ایجاد می کنیم پایتون هر ویژگی را در a ذخیره می کند دیکته ویژگی که به آن دیکشنری پویا می گویند. این رفتار پیش‌فرض راحت به نظر می‌رسد، زیرا انعطاف‌پذیر است، اما زمانی که با تعداد زیادی نمونه کار می‌کنید یا استفاده از حافظه اهمیت دارد، این سربار می‌تواند قابل توجه باشد.

چگونه 'اسلات هاکار؟

پایتون اساسا از یک دیکشنری برای ذخیره ویژگی های کلاس استفاده می کند، اما یکی از گزینه های جایگزین استفاده از آن است اسلات ها. با تعریف این نام، به پایتون می‌گوییم که از ساختار ایستا و فشرده‌تر استفاده کند که مصرف حافظه را به میزان قابل توجهی کاهش می‌دهد. در اینجا یک مثال اساسی از نحوه استفاده از اسلات ها در یک کلاس آورده شده است.

import sys

class WithoutSlots:
def __init__(self, x, y):
self.x = x
self.y = y

class WithSlots:
__slots__ = [‘x’, ‘y’]

def __init__(self, x, y):
self.x = x
self.y = y

obj1 = WithoutSlots(1, 2)
obj2 = WithSlots(1, 2)

print(sys.getsizeof(obj1.__dict__)) # 296
print(sys.getsizeof(obj2)) # 48

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

همانطور که در بالا نشان داده شد، “WithoutSlots” در مقایسه با “WithSlots” از حافظه بسیار بیشتری استفاده می کند. به ایجاد نمونه های زیادی از کلاس فکر کنید – کدام رویکرد انتخاب بهتری خواهد بود؟

محدودیت ها

اسلات ها ممکن است ابزار مفیدی باشد، اما با محدودیت هایی همراه است:

بدون ویژگی پویا: در حین تعریف اسلات ها در بدنه کلاس، ویژگی پیش فرض آن را غیرفعال می کنیم (دیکته)، بنابراین ما نمی توانیم به صورت پویا ویژگی های جدید را پس از ایجاد نمونه به آن اضافه کنیم.

obj = WithSlots(1, 2)
obj.z = 3 # This will raise an AttributeError

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ما می توانیم با اضافه کردن این موضوع را دور بزنیم دیکته به شکاف.

بدون ارث چندگانه: هر کلاس پایه باید شامل باشد اسلات ها تعریف شده است، در غیر این صورت پایتون به استفاده از دیکشنری برای ذخیره ویژگی های نمونه برمی گردد.
بدون مقدار پیش فرض: شما باید به طور صریح مقادیر پیش فرض را در متد init مقداردهی اولیه کنید.

چه زمانی از آن استفاده کنید

من چند نمونه بهترین سناریو را که می‌توانیم از اسلات‌ها استفاده کنیم، یادداشت کرده‌ام:

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

افکار نهایی

اینگونه است اسلات ها در پایتون استفاده می شود: زمانی که مطمئن هستید به هیچ ویژگی دیگری برای کلاس خود نیاز ندارید و با تعداد زیادی نمونه کار می کنید می توانید از آنها استفاده کنید. با تعریف اسلات ها، به پایتون می گویید که از ساختار کارآمدتر و فشرده تر برای ذخیره ویژگی ها استفاده کند که به صرفه جویی در حافظه کمک می کند. این به ویژه زمانی مفید است که استفاده از حافظه مورد توجه است یا زمانی که نیاز به بهینه سازی عملکرد دارید. فقط به یاد داشته باشید که با اسلات ها، نمی توانید ویژگی های جدید را به صورت پویا اضافه کنید، بنابراین زمانی که ویژگی های کلاس شما ثابت و به خوبی تعریف شده باشد بهتر است از آن استفاده کنید.

هر بار که ما یک کلاس جدید ایجاد می کنیم پایتون هر ویژگی را در a ذخیره می کند دیکته ویژگی که به آن دیکشنری پویا می گویند. این رفتار پیش‌فرض راحت به نظر می‌رسد، زیرا انعطاف‌پذیر است، اما زمانی که با تعداد زیادی نمونه کار می‌کنید یا استفاده از حافظه اهمیت دارد، این سربار می‌تواند قابل توجه باشد.

https%3A%2F%2Fdev to

چگونه 'اسلات هاکار؟

پایتون اساسا از یک دیکشنری برای ذخیره ویژگی های کلاس استفاده می کند، اما یکی از گزینه های جایگزین استفاده از آن است اسلات ها. با تعریف این نام، به پایتون می‌گوییم که از ساختار ایستا و فشرده‌تر استفاده کند که مصرف حافظه را به میزان قابل توجهی کاهش می‌دهد. در اینجا یک مثال اساسی از نحوه استفاده از اسلات ها در یک کلاس آورده شده است.

import sys 

class WithoutSlots:
    def __init__(self, x, y):
        self.x = x
        self.y = y

class WithSlots:
    __slots__ = ['x', 'y']

    def __init__(self, x, y):
        self.x = x
        self.y = y

obj1 = WithoutSlots(1, 2)
obj2 = WithSlots(1, 2)

print(sys.getsizeof(obj1.__dict__)) # 296
print(sys.getsizeof(obj2)) # 48
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

همانطور که در بالا نشان داده شد، “WithoutSlots” در مقایسه با “WithSlots” از حافظه بسیار بیشتری استفاده می کند. به ایجاد نمونه های زیادی از کلاس فکر کنید – کدام رویکرد انتخاب بهتری خواهد بود؟

محدودیت ها

محدودیت ها

اسلات ها ممکن است ابزار مفیدی باشد، اما با محدودیت هایی همراه است:

  • بدون ویژگی پویا: در حین تعریف اسلات ها در بدنه کلاس، ویژگی پیش فرض آن را غیرفعال می کنیم (دیکته)، بنابراین ما نمی توانیم به صورت پویا ویژگی های جدید را پس از ایجاد نمونه به آن اضافه کنیم.
obj = WithSlots(1, 2)
obj.z = 3  # This will raise an AttributeError
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ما می توانیم با اضافه کردن این موضوع را دور بزنیم دیکته به شکاف.

  • بدون ارث چندگانه: هر کلاس پایه باید شامل باشد اسلات ها تعریف شده است، در غیر این صورت پایتون به استفاده از دیکشنری برای ذخیره ویژگی های نمونه برمی گردد.

  • بدون مقدار پیش فرض: شما باید به طور صریح مقادیر پیش فرض را در متد init مقداردهی اولیه کنید.

چه زمانی از آن استفاده کنید

چه زمانی از آن استفاده کنید

من چند نمونه بهترین سناریو را که می‌توانیم از اسلات‌ها استفاده کنیم، یادداشت کرده‌ام:

  • وقتی نمونه های زیادی برای ایجاد داریم و استفاده از حافظه باعث نگرانی می شود.
  • زمانی که باید عملکرد را بهینه کنیم.
  • وقتی صفاتی دارید که شناخته شده و ثابت هستند.
  • وقتی با مجموعه داده های بزرگ کار می کنید.

افکار نهایی

افکار نهایی

اینگونه است اسلات ها در پایتون استفاده می شود: زمانی که مطمئن هستید به هیچ ویژگی دیگری برای کلاس خود نیاز ندارید و با تعداد زیادی نمونه کار می کنید می توانید از آنها استفاده کنید. با تعریف اسلات ها، به پایتون می گویید که از ساختار کارآمدتر و فشرده تر برای ذخیره ویژگی ها استفاده کند که به صرفه جویی در حافظه کمک می کند. این به ویژه زمانی مفید است که استفاده از حافظه مورد توجه است یا زمانی که نیاز به بهینه سازی عملکرد دارید. فقط به یاد داشته باشید که با اسلات ها، نمی توانید ویژگی های جدید را به صورت پویا اضافه کنید، بنابراین زمانی که ویژگی های کلاس شما ثابت و به خوبی تعریف شده باشد بهتر است از آن استفاده کنید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا