Skip to content

     array.array הוא טיפוס נתונים מיוחד ב-Python, המיועד לאחסון רצפים של מספרים מאותו טיפוס. בניגוד ל-list, מערכי array.array מספקים שימוש יעיל יותר בזיכרון וביצועים גבוהים יותר בעבודה עם נתונים מספריים. במאמר זה נבחן את המקרים בהם מומלץ להשתמש ב-array.array.


🔹 מתי להשתמש ב-array.array?

1. לעבודה עם מערכים גדולים של מספרים

     בעת עיבוד כמויות גדולות של נתונים מספריים, array.array מאפשר לחסוך משמעותית בזיכרון, שכן הוא מאחסן אלמנטים בצורה דחוסה. בניגוד ל-list, המשתמש באובייקטי Python לאחסון ערכים, array.array משתמש בבלוק זיכרון רציף בו מספרים מאוחסנים כרצפי בתים פשוטים. זה מקטין את התקורה הקשורה בניהול אובייקטי Python ומאיץ גישה לאלמנטים.

     שימוש ב-array.array יעיל במיוחד כאשר יש לעבד מיליוני או מיליארדי מספרים, לדוגמה בניתוח נתונים, חישובים מדעיים או עיבוד תמונה.

דוגמה להשוואת זיכרון בין array.array ל-list:

import array
import sys

# יצירת רשימה ומערך עם מיליון אלמנטים
list_numbers = list(range(10**6))
array_numbers = array.array('i', range(10**6))

# השוואת הזיכרון הנצרך
print("גודל הרשימה:", sys.getsizeof(list_numbers))  # גדול משמעותית
print("גודל המערך:", sys.getsizeof(array_numbers))  # קטן יותר, שכן הנתונים מאוחסנים בצורה דחוסה

2. כאשר נדרשים ביצועים גבוהים

     פעולות קריאה, כתיבה ופעולות על array.array מהירות יותר מאשר על list, שכן המערך משתמש בייצוג קבוע של אלמנטים בזיכרון.

arr = array.array('d', [1.1, 2.2, 3.3, 4.4, 5.5])
sum_arr = sum(arr)  # מתבצע מהר יותר מאשר עבור list

3. לצורך העברת נתונים לספריות C

אם נדרשת העברה של מערך נתונים ל-C או אינטראקציה עם ctypes ו-struct, array.array מפשט משמעותית את המשימה. מערך array.array מאחסן נתונים בצורה דחוסה, מה שהופך אותו נוח להעברה לפונקציות ו-API מקוריים ב-C, המצפים לרצף מספרים בתצורה של בלוק זיכרון רציף.

דוגמה לשימוש עם ctypes:

from ctypes import c_double
import array

arr = array.array('d', [1.1, 2.2, 3.3])
c_arr = (c_double * len(arr))(*arr)  # יצירת מערך תואם C

     שימוש ב-array.array מאפשר להימנע מהמרות נוספות של טיפוסי נתונים והעתקת זיכרון, דבר חשוב במיוחד בעבודה עם חישובים בעלי ביצועים גבוהים וספריות ב-C.

דוגמה לשימוש עם struct, המסייע בקידוד ופענוח נתונים בינאריים:

import struct
import array

arr = array.array('i', [10, 20, 30])
binary_data = struct.pack(f'{len(arr)}i', *arr)  # המרת מערך לנתונים בינאריים
unpacked_data = struct.unpack(f'{len(arr)}i', binary_data)
print(unpacked_data)  # (10, 20, 30)

4. להחלפת נתונים בינאריים

     אם יש צורך לאחסן ולהעביר נתונים מספריים בפורמט בינארי דחוס, array.array מספק את השיטות הנוחות tobytes() ו-frombytes(). שיטות אלו מאפשרות להמיר בקלות מערך לרצף בתים ובחזרה ללא צורך בהמרות נוספות, כפי שנדרש עבור רשימות.

דוגמה לשמירה ושחזור מערך מנתונים בינאריים:

arr = array.array('i', [1, 2, 3, 4])
binary_data = arr.tobytes()

new_arr = array.array('i')
new_arr.frombytes(binary_data)
print(new_arr)  # array('i', [1, 2, 3, 4])

מנגנון זה שימושי במיוחד בעבודה עם קבצים, פרוטוקולי רשת או פורמטים בינאריים של נתונים, כאשר נדרשת העברה של מערכים מספריים בצורה דחוסה ויעילה.

5. לעבודה עם מבני נתונים קבועים

     אם ידוע מראש שנדרש לאחסן רק טיפוס נתונים אחד, שימוש ב-array.array מבטיח היעדר שגיאות הקשורות לאלמנטים מטיפוסים שונים.

arr = array.array('i', [100, 200, 300])
# arr.append('hello')  # שגיאה! מצופה רק int

6. לאחסון נתונים בקבצים בינאריים

     אם נדרש לאחסן מערך של מספרים בקובץ ולטעון אותו במהירות ללא המרות מיותרות, array.array מפשט משמעותית את המשימה.

arr = array.array('i', [10, 20, 30])
arr.tofile(open('data.bin', 'wb'))

new_arr = array.array('i')
new_arr.fromfile(open('data.bin', 'rb'), 3)
print(new_arr)  # array('i', [10, 20, 30])

🔹 השוואת array.array ו-list

מאפייןarray.arraylist
טיפוס נתוניםאלמנטים מאותו טיפוסאלמנטים מטיפוסים שונים
צריכת זיכרוןפחותיותר
מהירות פעולותמהיר יותר עבור מספריםאיטי יותר
תמיכת שיטותמוגבלתפונקציונליות עשירה
תאימותמתאים ל-C APIאוניברסלי
נתונים בינארייםתומך ב-tobytes()דורש pickle או struct

🚀 אם נדרשת יעילות בעבודה עם מספרים, השתמשו ב-array.array.
עבור אוניברסליות ונוחות, עדיף להשתמש ב-list!


כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *