کتابخانه array در پایتون
کتابخانهٔ استاندارد array در پایتون ماژولی سبک برای کار با آرایههای همنوع (homogeneous) است. برخلاف لیستهای پایتون که میتوانند انواع مختلفی را نگه دارند، آرایههای این ماژول فقط یک نوع دادهٔ ثابت (مثلاً اعداد صحیح یا اعشاری) را در بر میگیرند و در استفادههای خاص میتوانند حافظهٔ کمتری مصرف کنند و سازگاری بهتری با فرمتهای باینری داشته باشند.
چرا از array استفاده کنیم؟
- مصرف حافظه کمتر نسبت به لیست برای دادههای همنوع
- تبدیل آسان به بایتها و نوشتن مستقیم در فایلهای باینری
- سازگاری با برخی APIها که نیاز به ساختارهای باینری دارند
- پیادهسازی ساده و بدون وابستگی به بستههای خارجی
مفاهیم پایه و typecodeها
برای ساخت آرایه از کلاس array در ماژول array استفاده میکنیم که نیاز به typecode دارد؛ typecode نشاندهندهٔ نوع دادهٔ عناصر است: مثلاً ‘i’ برای int، ‘f’ برای float، ‘d’ برای double و غیره. لیست کامل typecodeها در مستندات رسمی موجود است.
from array import array
# ساخت آرایه از اعداد صحیح
a = array('i', [1, 2, 3, 4])
# آرایه اعشاری
b = array('f', [1.0, 2.5, 3.14])در این کد ما دو آرایه ایجاد کردهایم: a با typecode ‘i’ برای اعداد صحیح و b با typecode ‘f’ برای اعداد اعشاری. آرایهها شبیه لیست قابل ایندکس و iterate هستند اما همهٔ عناصر از یک نوع میباشند.
عملیات معمول روی آرایه
- append، extend، insert — اضافه کردن عنصر یا لیست
- pop، remove — حذف عناصر
- tobytes، frombytes — تبدیل به/از بایت برای I/O
- buffer_info — اطلاعات دربارهٔ آدرس و طول آرایه (برای استفادههای سطح پایین)
from array import array
a = array('i', [10, 20, 30])
a.append(40)
a.extend([50, 60])
print(a.tolist()) # تبدیل به لیست برای نمایش
print(a.tobytes()) # نمایش بایتها
addr, length = a.buffer_info()
print(addr, length)کد بالا ابتدا آرایهٔ a را با چند مقدار میسازد، سپس با append و extend مقدار اضافه میکند. tolist برای تبدیل به لیست پایتون مفید است و tobytes آرایه را به نمای باینریاش تبدیل میکند. buffer_info اطلاعاتی از قبیل آدرس حافظه و طول آرایه برمیگرداند که برای تعامل با کدهای سطح پایین یا C مفید است.
تفاوت آرایه با لیست و NumPy
در عمل چند گزینه برای نگهداری دادههای عددی وجود دارد: لیستهای پایتون، ماژول array و کتابخانهٔ خارجی NumPy. هر کدام مزایا و معایب خود را دارند.
| ویژگی | list | array | NumPy ndarray |
|---|---|---|---|
| همنوع بودن عناصر | خیر | بله | بله |
| مصرف حافظه | افزایشیافته | کمتر | بسیار بهینه |
| سرعت محاسبات عددی | ضعیف | متوسط | عالی (با عملیات برداری) |
| وابستگی خارجی | خیر | خیر | بله (numpy) |
اگر فقط به صرفهجویی در حافظه و نگهداری سادهٔ دادههای همنوع نیاز دارید کتابخانهٔ array گزینهٔ مناسبی است. اگر نیاز به عملیات برداری و عملکرد بالا دارید، NumPy برتر است.
مثال: خواندن و نوشتن باینری با array
from array import array
# ذخیره آرایه در فایل باینری
a = array('i', range(100))
with open('data.bin', 'wb') as f:
a.tofile(f)
# خواندن مجدد از فایل
b = array('i')
with open('data.bin', 'rb') as f:
b.fromfile(f, 100)
print(b[0], b[-1])در این مثال آرایهای از 100 عدد صحیح ساخته و با tofile به فایل باینری نوشته شده است. سپس آرایهٔ جدید b با fromfile همان مقادیر را میخواند. این روش برای تبادل داده با برنامههایی که به فرمت باینری نیاز دارند بسیار مفید است.
بهینهسازی و نکات پیشرفته
- برای پردازشهای عددی سنگین از NumPy استفاده کنید؛ array مناسب وظایف ساده و تعاملی است.
- برای کاهش هزینهٔ تبدیلها، در جاهایی که نیاز به بایت دارید از tobytes و memoryview استفاده کنید.
- توجه به endianess و typecode زمانی که بین ماشینها یا زبانهای مختلف داده رد و بدل میکنید اهمیت دارد.
from array import array
a = array('h', [1, 2, 3]) # 'h' signed short
mv = memoryview(a)
# خواندن بایتها بدون کپی اضافی
b = mv.tobytes()
print(len(b))در اینجا با استفاده از memoryview انتقال داده بدون کپی اضافی انجام میشود که برای صرفهجویی در حافظه و افزایش کارایی مهم است. مخصوصاً زمانی که مجموعهٔ داده بزرگ است یا عمل I/O مکرر دارید.
مقایسهٔ حافظه (نمونهٔ عملی)
در عمل برای مشاهدهٔ تفاوت حافظه میتوانید از sys.getsizeof استفاده کنید؛ البته این مقدار تنها بخش مشخصی از حافظهٔ اشغالشده را نشان میدهد ولی تصویر کلی میدهد.
import sys
from array import array
lst = list(range(1000))
arr = array('i', lst)
print(sys.getsizeof(lst))
print(sys.getsizeof(arr))این کد نشان میدهد که آرایه از نظر حافظه نسبت به لیست صرفهجویی میکند. توجه داشته باشید که getsizeof مقدار تقریبی است و شامل حافظهٔ اشارهگرهای داخلی و Overhead اشیاء پایتون نمیشود؛ ولی تفاوت قابل مشاهده خواهد بود.
موارد کاربرد عملی
- ذخیرهسازی خام اعداد قبل از ارسال به سختافزار یا پردازش C
- نوشتن و خواندن دادهٔ باینری برای فایلهای ساده
- کار با سیگنالها یا دادههای خام از سنسورها که نیاز به فرمتی ساده و همنوع دارند
جمعبندی
ماژول array ابزار ساده و مؤثری برای کار با مجموعههای همنوع داده در پایتون است. اگرچه قدرت محاسباتی و امکانات NumPy را ندارد، برای کارهای سبک، تبادل باینری و کاهش مصرف حافظه بسیار کاربردی است. در انتخاب میان لیست، array و NumPy، نیازهای عملکردی، حافظه و وابستگیهای پروژه را در نظر بگیرید.
آیا این مطلب برای شما مفید بود ؟




