وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

تعیین اندازه یک شی در پایتون

0 63
زمان لازم برای مطالعه: 4 دقیقه


معرفی

هنگام نوشتن کد، ممکن است لازم باشد تعیین کنید که یک شی خاص چقدر حافظه مصرف می کند. دلایل مختلفی وجود دارد که ممکن است لازم باشد این را بدانید که واضح ترین دلیل آن محدودیت ظرفیت ذخیره سازی است. این بایت به شما نشان می دهد که چگونه اندازه یک شی را در پایتون تعیین کنید. ما این کار را در درجه اول با نسخه داخلی پایتون انجام خواهیم داد sys.getsizeof() تابع.

چرا اندازه یک شی را تعیین می کنیم؟

تعیین اندازه یک شی در پایتون می تواند بسیار مفید باشد، به خصوص زمانی که با مجموعه داده های بزرگ یا اشیاء پیچیده سروکار دارید. دانستن اندازه یک شی می تواند به بهینه سازی کد شما برای کاهش مصرف حافظه کمک کند، که می تواند منجر به عملکرد بهتر شود. به علاوه، می تواند به شما در رفع مشکلات مربوط به مصرف حافظه کمک کند.

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

استفاده کردن sys.getsizeof() برای تعیین اندازه

پایتون یک تابع داخلی ارائه می دهد، sys.getsizeof()، که می تواند برای تعیین اندازه یک شی استفاده شود. این تابع اندازه را بر حسب بایت برمی گرداند.

در اینجا یک مثال ساده آورده شده است:

import sys


my_list = (1, 2, 3, 4, 5)


size = sys.getsizeof(my_list)

print(f"The size of the list is {size} bytes.")

هنگامی که این کد را اجرا می کنید، خروجی مانند زیر را خواهید دید:

$ python3 size.py
The size of the list is 104 bytes.

در این مثال، sys.getsizeof() اندازه شی لیست را برمی گرداند my_list در بایت

تغییرات از sys.getsizeof()

در حالی که sys.getsizeof() می تواند بسیار مفید باشد، باید بدانید که همیشه در مورد اندازه یک جسم تصویر کاملی را ارائه نمی دهد.

توجه داشته باشید: sys.getsizeof() فقط برمی گرداند مصرف فوری حافظه از یک شی، اما حافظه مصرف شده توسط سایر اشیاء مورد اشاره را شامل نمی شود.

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

برای مثال، اگر لیستی از لیست ها دارید، sys.getsizeof() فقط اندازه لیست بیرونی را برمی گرداند، نه اندازه کل شامل لیست های داخلی.

import sys


my_list = ((1, 2, 3), (4, 5, 6), (7, 8, 9))


size = sys.getsizeof(my_list)

print(f"The size of the list is {size} bytes.")

هنگامی که این کد را اجرا می کنید، خروجی مانند زیر را خواهید دید:

$ python3 size.py
The size of the list is 80 bytes.

همانطور که می بینید، sys.getsizeof() اندازه لیست بیرونی را برمی گرداند، اما اندازه لیست های داخلی را نمی دهد. این چیزی است که هنگام استفاده باید در نظر داشت sys.getsizeof() برای تعیین اندازه اشیاء پیچیده در پایتون.

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

استفاده از pympler.asizeof() برای اندازه دقیق اشیا

در حالی که sys.getsizeof() یک روش داخلی در پایتون است و همیشه دقیق ترین نتایج را به خصوص برای اشیاء پیچیده ارائه نمی دهد. برای اندازه گیری دقیق تر، می توانیم از asizeof() تابع از Pympler کتابخانه

Pympler یک ابزار توسعه برای اندازه گیری، نظارت و تجزیه و تحلیل رفتار حافظه اشیاء پایتون در یک برنامه در حال اجرا پایتون است.

برای استفاده asizeof()، ابتدا باید Pympler را با استفاده از آن نصب کنید pip:

$ pip3 install pympler

پس از نصب، می توانید استفاده کنید asizeof() مثل این:

from pympler import asizeof

my_list = list(range(1000))
print(asizeof.asizeof(my_list))

در این مثال، asizeof() اندازه کل را برمی گرداند my_list، شامل تمام عناصر آن.

بر خلاف sys.getsizeof()، asizeof() اندازه اشیاء تودرتو در محاسبات خود گنجانده شده است و آن را به ابزار دقیق تری برای تعیین اندازه اشیاء پیچیده تبدیل می کند.

مقایسه کردن sys.getsizeof() و pympler.asizeof()

بیایید نتایج را با هم مقایسه کنیم sys.getsizeof() و asizeof() برای یک شی پیچیده، مانند یک فرهنگ لغت با چندین جفت کلید-مقدار.

import sys
from pympler import asizeof

my_dict = {i: str(i) for i in range(1000)}

print('sys.getsizeof():', sys.getsizeof(my_dict))
print('asizeof():', asizeof.asizeof(my_dict))
$ python3 size_compare.py
sys.getsizeof(): 36960
asizeof(): 124952

همانطور که می بینید، asizeof() مقداری را برمی گرداند که تمام شده است 3.3 برابر بزرگتر از آنچه توسط آن برگردانده می شود sys.getsizeof(). این بخاطر این است که sys.getsizeof() فقط حافظه مصرف شده توسط خود فرهنگ لغت را اندازه گیری می کند، نه همه محتویات آن را. از سوی دیگر، asizeof() اندازه کل، از جمله فرهنگ لغت و تمام محتویات آن را اندازه گیری می کند.

پیشنهاد می‌کنیم بخوانید:  راهنمای مسیریاب Vue هنگام توسعه برنامه های وب با Vue.js، مگر اینکه در حال ساخت یک برنامه تک صفحه ای (SPA) باشید، می خواهید چندین صفحه را به یک فرود متصل کنید. page تا کاربران بتوانند در میان آنها حرکت کنند. این به عنوان مسیریابی شناخته می شود. مسیریابی است process که توسط آن کاربر به صفحات مختلف هدایت می شود روی...

پرداختن به مدیریت حافظه در پایتون

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

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

یادداشت جانبی: جمع‌آوری زباله پایتون زمانی وارد بازی می‌شود که ارجاعات دایره‌ای وجود داشته باشد – یعنی زمانی که گروهی از اشیاء به یکدیگر ارجاع می‌دهند، اما به جای دیگری ارجاع نمی‌شوند. در چنین موردی، حتی اگر تعداد مراجع آنها از نظر فنی صفر نباشد، هنوز هم می‌توان با خیال راحت از حافظه حذف کرد.

نتیجه

درک روش اندازه گیری اندازه اشیاء در پایتون می تواند ابزار مفیدی در بهینه سازی یا حتی اشکال زدایی کد شما باشد، به ویژه برای برنامه هایی که حجم زیادی از داده را مدیریت می کنند. در حالی که پایتون داخلی است sys.getsizeof() تابع می تواند مفید باشد، asizeof() تابع کتابخانه Pympler اندازه گیری دقیق تری را برای اشیاء پیچیده ارائه می دهد.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1402-12-27 16:31:06

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

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

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید