Skip to content
> ๐Ÿ’ป ๐Ÿง  ืงื•ื“ 1001 > ๐Ÿงช๐Ÿ““ ืœืœื ืงื˜ื’ื•ืจื™ื” > ๐Ÿง‘โ€๐Ÿ’ป ืฉื™ืžื•ืฉ ื‘-array.array ื‘ืคื™ื™ืชื•ืŸ: ืžืชื™ ื•ืœืžื” ืœื”ืฉืชืžืฉ

๐Ÿง‘โ€๐Ÿ’ป ืฉื™ืžื•ืฉ ื‘-array.array ื‘ืคื™ื™ืชื•ืŸ: ืžืชื™ ื•ืœืžื” ืœื”ืฉืชืžืฉ


๐Ÿ“ฆ ื™ืชืจื•ื ื•ืช ืžืจื›ื–ื™ื™ื ืฉืœ array.array

ื”ื”ื‘ื“ืœ ื”ืžืจื›ื–ื™ ื‘ื™ืŸ array.array ืœ-list ื”ื•ื ืื—ืกื•ืŸ ื ืชื•ื ื™ื ืงื•ืžืคืงื˜ื™. ื‘ืžืงื•ื ืจืฉื™ืžื” ืฉืœ ืžืฆื‘ื™ืขื™ื ืœืื•ื‘ื™ื™ืงื˜ื™ื ืฉืœ ืคื™ื™ืชื•ืŸ, array.array ืฉื•ืžืจ ืืช ื”ืขืจื›ื™ื ื›ื‘ืœื•ืง ืจืฆื™ืฃ ืฉืœ ื‘ืชื™ื, ืžื” ืฉื”ื•ืคืš ืื•ืชื• ืœืื™ื“ื™ืืœื™ ืœืžืฉื™ืžื•ืช ื”ื‘ืื•ืช.


1. ื—ื™ืกื›ื•ืŸ ื‘ื–ื™ื›ืจื•ืŸ ื‘ืขื‘ื•ื“ื” ืขื ื›ืžื•ื™ื•ืช ื’ื“ื•ืœื•ืช ืฉืœ ืžืกืคืจื™ื

ื‘ืขืช ืขื™ื‘ื•ื“ ืฉืœ ืžื™ืœื™ื•ื ื™ ืจื›ื™ื‘ื™ื ืžืกืคืจื™ื™ื, ื”ื—ื™ืกื›ื•ืŸ ื‘ื–ื™ื›ืจื•ืŸ ื”ื•ืคืš ืœืงืจื™ื˜ื™. array.array ืžืคื—ื™ืช ืžืฉืžืขื•ืชื™ืช ืืช ื”ืชืงื•ืจื”.

import array
import sys

def compare_memory_usage(num_elements: int = 1_000_000) -> None:
    """
    ืžืฉื•ื•ื” ืืช ืฆืจื™ื›ืช ื”ื–ื™ื›ืจื•ืŸ ื‘ื™ืŸ list ืœ-array.array.

    Args:
        num_elements (int, optional): ืžืกืคืจ ื”ืจื›ื™ื‘ื™ื ืœื‘ื“ื™ืงื”. 
                                      ื‘ืจื™ืจืช ืžื—ื“ืœ ื”ื™ื 1,000,000.
    """
    # ื™ืฆื™ืจืช ืจืฉื™ืžื” ืขื ืื•ื‘ื™ื™ืงื˜ื™ื ืฉืœืžื™ื ืฉืœ ืคื™ื™ืชื•ืŸ
    list_numbers = list(range(num_elements))

    # ื™ืฆื™ืจืช ืžืขืจืš ืฉื‘ื• ืžืกืคืจื™ื ืžืื•ื—ืกื ื™ื ื›ืžืกืคืจื™ื ืฉืœืžื™ื ืžื˜ื™ืคื•ืก C ื‘ื’ื•ื“ืœ 4 ื‘ืชื™ื
    array_numbers = array.array('i', range(num_elements))

    list_size = sys.getsizeof(list_numbers)
    array_size = sys.getsizeof(array_numbers)

    print(f"ืžืกืคืจ ืจื›ื™ื‘ื™ื: {num_elements}")
    print(f"ื’ื•ื“ืœ ื”ืจืฉื™ืžื”:  {list_size / 1024 / 1024:.2f} MB")
    print(f"ื’ื•ื“ืœ ื”ืžืขืจืš: {array_size / 1024 / 1024:.2f} MB")
    if array_size > 0:
        print(f"ื—ื™ืกื›ื•ืŸ ื‘ื–ื™ื›ืจื•ืŸ: ืคื™ {list_size / array_size:.2f}")

# ื“ื•ื’ืžื” ืœืฉื™ืžื•ืฉ
if __name__ == "__main__":
    compare_memory_usage()

ืคืœื˜:

ืžืกืคืจ ืจื›ื™ื‘ื™ื: 1000000
ื’ื•ื“ืœ ื”ืจืฉื™ืžื”:  7.63 MB
ื’ื•ื“ืœ ื”ืžืขืจืš: 3.82 MB
ื—ื™ืกื›ื•ืŸ ื‘ื–ื™ื›ืจื•ืŸ: ืคื™ 2.00

2. ื‘ื™ืฆื•ืขื™ื ืžืฉื•ืคืจื™ื ื‘ืคืขื•ืœื•ืช ื ื•ืžืจื™ื•ืช

ื‘ื–ื›ื•ืช ื”ืงืฆืืช ื–ื™ื›ืจื•ืŸ ืจืฆื™ืคื”, ืคืขื•ืœื•ืช ืžืชืžื˜ื™ื•ืช ืขืœ ืจื›ื™ื‘ื™ array.array ืžืชื‘ืฆืขื•ืช ืžื”ืจ ื™ื•ืชืจ, ืžื›ื™ื•ื•ืŸ ืฉื”ืžืขื‘ื“ ื™ื›ื•ืœ ืœื ืฆืœ ืืช ื–ื™ื›ืจื•ืŸ ื”ืžื˜ืžื•ืŸ (cache) ื‘ื™ืขื™ืœื•ืช ืจื‘ื” ื™ื•ืชืจ.

import array
import timeit

def compare_performance(num_elements: int = 10_000_000) -> None:
    """
    ืžืฉื•ื•ื” ืืช ื‘ื™ืฆื•ืขื™ ืกื™ื›ื•ื ื”ืจื›ื™ื‘ื™ื ื‘-list ื•ื‘-array.array.

    Args:
        num_elements (int, optional): ืžืกืคืจ ื”ืจื›ื™ื‘ื™ื ืœื‘ื“ื™ืงื”. 
                                      ื‘ืจื™ืจืช ืžื—ื“ืœ ื”ื™ื 10,000,000.
    """
    setup_code = f"""
import array
data = range({num_elements})
list_data = list(data)
array_data = array.array('i', data)
"""

    # ืžื“ื™ื“ืช ื–ืžืŸ ืขื‘ื•ืจ ืจืฉื™ืžื”
    list_time = timeit.timeit("sum(list_data)", setup=setup_code, number=10)

    # ืžื“ื™ื“ืช ื–ืžืŸ ืขื‘ื•ืจ ืžืขืจืš
    array_time = timeit.timeit("sum(array_data)", setup=setup_code, number=10)

    print(f"ื–ืžืŸ ืœืกื™ื›ื•ื {num_elements} ืจื›ื™ื‘ื™ื (10 ืคืขืžื™ื):")
    print(f"ืจืฉื™ืžื”:  {list_time:.4f} ืฉื ื™ื•ืช")
    print(f"ืžืขืจืš: {array_time:.4f} ืฉื ื™ื•ืช")

# ื“ื•ื’ืžื” ืœืฉื™ืžื•ืฉ
if __name__ == "__main__":
    compare_performance()

ืคืœื˜:

ื–ืžืŸ ืœืกื™ื›ื•ื 10000000 ืจื›ื™ื‘ื™ื (10 ืคืขืžื™ื):
ืจืฉื™ืžื”:  2.1106 ืฉื ื™ื•ืช
ืžืขืจืš: 1.1549 ืฉื ื™ื•ืช

3. ืขื‘ื•ื“ื” ื™ืฉื™ืจื” ืขื ืกืคืจื™ื•ืช C (ื‘ืืžืฆืขื•ืช ctypes, struct)

array.array ื”ื•ื ืื™ื“ื™ืืœื™ ืœื”ืขื‘ืจืช ื ืชื•ื ื™ื ืœืกืคืจื™ื•ืช low-level ืฉื ื›ืชื‘ื• ื‘ืฉืคืช C, ืžื›ื™ื•ื•ืŸ ืฉื”ืžื‘ื ื” ื”ืคื ื™ืžื™ ืฉืœื• ืชื•ืื ืœืžืขืจื›ื™ื ื‘ืฉืคืช C.

ื“ื•ื’ืžื” ืขื ctypes:

import array
from ctypes import c_double, CDLL

def demonstrate_ctypes_usage() -> None:
    """
    ืžื“ื’ื™ื ื”ืขื‘ืจืช array.array ืœืคื•ื ืงืฆื™ื™ืช C ื‘ืืžืฆืขื•ืช ctypes.
    """
    # ืžืขืจืš ืขื ืžืกืคืจื™ื ื‘ื“ื™ื•ืง ื›ืคื•ืœ (ื˜ื™ืคื•ืก 'd')
    py_array = array.array('d', [1.1, 2.2, 3.3, 4.4])

    # ื™ืฆื™ืจืช ืžืขืจืš ืชื•ืื-C ืžืชื•ืš py_array
    # ื”ืคื•ื ืงืฆื™ื” (c_double * len(py_array)) ื™ื•ืฆืจืช ื˜ื™ืคื•ืก "ืžืขืจืš ืฉืœ 4 c_double"
    # ื”ื‘ื™ื˜ื•ื™ (*py_array) ืคื•ืจืก ืืช ืžืขืจืš ื”ืคื™ื™ืชื•ืŸ ืœืืจื’ื•ืžื ื˜ื™ื ืฉืœ ื”ื‘ื ืื™ ื”ื–ื”
    c_array = (c_double * len(py_array))(*py_array)

    # ื›ืืŸ ื™ื›ื•ืœื” ืœื”ื™ื•ืช ืงืจื™ืื” ืœืคื•ื ืงืฆื™ื™ืช C, ืœื“ื•ื’ืžื”:
    # my_c_library = CDLL("./libmath.so")
    # my_c_library.sum_doubles(c_array, len(c_array))

    print(f"ืžืขืจืš ืคื™ื™ืชื•ืŸ: {py_array}")
    print(f"ืžืขืจืš ืชื•ืื-C (ctypes): {[val for val in c_array]}")

# ื“ื•ื’ืžื” ืœืฉื™ืžื•ืฉ
if __name__ == "__main__":
    demonstrate_ctypes_usage()```

#### ื“ื•ื’ืžื” ืขื `struct` ืœืืจื™ื–ืช ื ืชื•ื ื™ื:

python
import array
import struct

def demonstrate_struct_packing(data: list[int]) -> bytes:
"""
ืื•ืจื– ืžืขืจืš ืฉืœ ืžืกืคืจื™ื ืฉืœืžื™ื ืœืžื—ืจื•ื–ืช ื‘ื™ื ืืจื™ืช.

Args:
    data (list[int]): ืจืฉื™ืžืช ืžืกืคืจื™ื ืฉืœืžื™ื ืœืืจื™ื–ื”.

Returns:
    bytes: ื™ื™ืฆื•ื’ ื‘ื™ื ืืจื™ ืฉืœ ื”ื ืชื•ื ื™ื.
"""
arr = array.array('i', data)

# ื™ืฆื™ืจืช ืžื—ืจื•ื–ืช ืคื•ืจืžื˜ ื›ืžื• '3i' ืขื‘ื•ืจ 3 ืžืกืคืจื™ื ืฉืœืžื™ื
format_string = f'{len(arr)}i'

# ืืจื™ื–ืช ื”ื ืชื•ื ื™ื ืœืคื•ืจืžื˜ ื‘ื™ื ืืจื™
binary_data = struct.pack(format_string, *arr)

print(f"ืžืขืจืš ืžืงื•ืจื™: {arr}")
print(f"ื ืชื•ื ื™ื ื‘ื™ื ืืจื™ื™ื: {binary_data}")

# ื‘ื“ื™ืงื”: ืคืจื™ืกื” ื—ื–ืจื”
unpacked_data = struct.unpack(format_string, binary_data)
print(f"ื ืชื•ื ื™ื ืœืื—ืจ ืคืจื™ืกื”: {unpacked_data}")

return binary_data

ื“ื•ื’ืžื” ืœืฉื™ืžื•ืฉ

if name == "main":
demonstrate_struct_packing([10, 20, 30])

---

### 4. ืกืจื™ืืœื™ื–ืฆื™ื” ื•ื“ื”-ืกืจื™ืืœื™ื–ืฆื™ื” ื™ืขื™ืœื•ืช

ื”ืžืชื•ื“ื•ืช `.tobytes()` ื•-`.frombytes()` ืžืืคืฉืจื•ืช ืœื”ืžื™ืจ ื‘ืžื”ื™ืจื•ืช ืžืขืจืš ืœื‘ืชื™ื ื•ื‘ื—ื–ืจื”, ืžื” ืฉืื™ื“ื™ืืœื™ ืœืฉืžื™ืจื” ื‘ืงื‘ืฆื™ื ืื• ืœื”ืขื‘ืจื” ื‘ืจืฉืช.

python
import array

def handle_binary_data() -> None:
"""
ืžื“ื’ื™ื ืกืจื™ืืœื™ื–ืฆื™ื” ื•ื“ื”-ืกืจื™ืืœื™ื–ืฆื™ื” ืฉืœ array.array ืœื‘ืชื™ื.
"""
# ื™ืฆื™ืจืช ืžืขืจืš ืžืงื•ืจ
source_array = array.array('i', [1, 2, 3, 4, 5])
print(f"ืžืขืจืš ืžืงื•ืจื™: {source_array}")

# ืกืจื™ืืœื™ื–ืฆื™ื” ืฉืœ ื”ืžืขืจืš ืœื‘ืชื™ื
binary_data = source_array.tobytes()
print(f"ื ืชื•ื ื™ื ื‘ื‘ืชื™ื: {binary_data}")

# ื“ื”-ืกืจื™ืืœื™ื–ืฆื™ื” ืžื‘ืชื™ื ืœืžืขืจืš ื—ื“ืฉ
new_array = array.array('i')
new_array.frombytes(binary_data)
print(f"ืžืขืจืš ืžืฉื•ื—ื–ืจ: {new_array}")

# ื‘ื“ื™ืงืช ืชืงื™ื ื•ืช
assert source_array == new_array, "ืื™-ื”ืชืืžื” ื‘ื ืชื•ื ื™ื!"
print("ืชืงื™ื ื•ืช ื”ื ืชื•ื ื™ื ืื•ืžืชื”.")

ื“ื•ื’ืžื” ืœืฉื™ืžื•ืฉ

if name == "main":
handle_binary_data()

---

### 5. ื”ื‘ื˜ื—ืช ื”ื•ืžื•ื’ื ื™ื•ืช ืฉืœ ื˜ื™ืคื•ืกื™ื

`array.array` ืื•ื›ืฃ ื‘ืงืคื“ื ื•ืช ืฉื™ืžื•ืฉ ื‘ื˜ื™ืคื•ืก ื ืชื•ื ื™ื ื™ื—ื™ื“, ืฉื ืงื‘ืข ื‘ืขืช ื”ื™ืฆื™ืจื”. ื”ื“ื‘ืจ ืžื•ื ืข ื”ื•ืกืคื” ื‘ื˜ืขื•ืช ืฉืœ ืจื›ื™ื‘ื™ื ืžื˜ื™ืคื•ืก ืื—ืจ.

python
import array

def demonstrate_type_safety() -> None:
"""
ืžืจืื” ืฉ-array.array ืื™ื ื• ืžืืคืฉืจ ื”ื•ืกืคืช ืจื›ื™ื‘ื™ื ืžื˜ื™ืคื•ืก ืฉื•ื ื”.
"""
arr = array.array('i', [100, 200, 300])
print(f"ืžืขืจืš ืžืกืคืจื™ื ืฉืœืžื™ื: {arr}")

try:
    # ื ื™ืกื™ื•ืŸ ืœื”ื•ืกื™ืฃ ืจื›ื™ื‘ ืžืกื•ื’ ืžื—ืจื•ื–ืช
    arr.append('hello')
except TypeError as e:
    # ื—ืจื™ื’ื” ืฆืคื•ื™ื”
    print(f"\nื”ื ื™ืกื™ื•ืŸ ืœื”ื•ืกื™ืฃ 'hello' ื’ืจื ืœืฉื’ื™ืื”: {e}")
    print("ื“ื‘ืจ ื–ื” ืžืืฉืจ ืืช ืื›ื™ืคืช ื”ื˜ื™ืคื•ืกื™ื ื”ืžื—ืžื™ืจื” ืฉืœ ื”ืžืขืจืš.")

ื“ื•ื’ืžื” ืœืฉื™ืžื•ืฉ

if name == "main":
demonstrate_type_safety()

---

### 6. ื›ืชื™ื‘ื” ื•ืงืจื™ืื” ื™ืฉื™ืจื” ืžืงื‘ืฆื™ื ื‘ื™ื ืืจื™ื™ื

ื”ืžืชื•ื“ื•ืช `.tofile()` ื•-`.fromfile()` ืžืคืฉื˜ื•ืช ืืช ื”ืขื‘ื•ื“ื” ืขื ืงื‘ืฆื™ื ื‘ื™ื ืืจื™ื™ื, ืชื•ืš ื”ื™ืžื ืขื•ืช ืžืกืจื™ืืœื™ื–ืฆื™ื” ื›ืฉืœื‘ ื‘ื™ื ื™ื™ื.

python
import array
from pathlib import Path

def work_with_binary_files(file_path_str: str = "data.bin") -> None:
"""
ื›ื•ืชื‘ ืžืขืจืš ืœืงื•ื‘ืฅ ื‘ื™ื ืืจื™ ื•ืงื•ืจื ืื•ืชื• ื‘ื—ื–ืจื”.

Args:
    file_path_str (str, optional): ืฉื ื”ืงื•ื‘ืฅ ืœืฉืžื™ืจื”.
                                   ื‘ืจื™ืจืช ืžื—ื“ืœ ื”ื™ื "data.bin".
"""
file_path = Path(file_path_str)
source_array = array.array('f', [1.5, 2.7, 3.14])

try:
    # ื›ืชื™ื‘ื” ืœืงื•ื‘ืฅ
    with file_path.open('wb') as f:
        source_array.tofile(f)
    print(f"ื”ืžืขืจืš {source_array} ื ื›ืชื‘ ืœืงื•ื‘ืฅ '{file_path}'.")

    # ืงืจื™ืื” ืžื”ืงื•ื‘ืฅ
    new_array = array.array('f')
    with file_path.open('rb') as f:
        # ืงืจื™ืืช 3 ืจื›ื™ื‘ื™ื ืžื˜ื™ืคื•ืก 'f' (float)
        new_array.fromfile(f, len(source_array))
    print(f"ื”ืžืขืจืš {new_array} ื ืงืจื ืžื”ืงื•ื‘ืฅ.")

    assert source_array == new_array

finally:
    # ื”ื‘ื˜ื—ืช ืžื—ื™ืงืช ื”ืงื•ื‘ืฅ ืœืื—ืจ ื”ื‘ื™ืฆื•ืข
    if file_path.exists():
        file_path.unlink()
        print(f"ื”ืงื•ื‘ืฅ ื”ื–ืžื ื™ '{file_path}' ื ืžื—ืง.")

ื“ื•ื’ืžื” ืœืฉื™ืžื•ืฉ

if name == "main":
work_with_binary_files()
"`


๐Ÿ”น ื˜ื‘ืœืช ื”ืฉื•ื•ืื”: array.array ืžื•ืœ list

ืžืืคื™ื™ืŸarray.arraylist
ื˜ื™ืคื•ืก ื ืชื•ื ื™ืื˜ื™ืคื•ืกื™ื ืคืจื™ืžื™ื˜ื™ื‘ื™ื™ื ื•ื”ื•ืžื•ื’ื ื™ื™ื (ืžืกืคืจื™ื, ืชื•ื•ื™ื)ื›ืœ ืื•ื‘ื™ื™ืงื˜ ืคื™ื™ืชื•ืŸ
ื–ื™ื›ืจื•ืŸืฆืจื™ื›ื” ื ืžื•ื›ื”ืฆืจื™ื›ื” ื’ื‘ื•ื”ื”
ื‘ื™ืฆื•ืขื™ืื’ื‘ื•ื”ื™ื ื‘ืคืขื•ืœื•ืช ื ื•ืžืจื™ื•ืชื ืžื•ื›ื™ื ื™ื•ืชืจ ื‘ืคืขื•ืœื•ืช ื ื•ืžืจื™ื•ืช
APIืกื˜ ืžื•ื’ื‘ืœ ืฉืœ ืžืชื•ื“ื•ืชAPI ืขืฉื™ืจ ื•ื’ืžื™ืฉ
ืชืื™ืžื•ืช ืœ-Cื’ื‘ื•ื”ื”, ื”ืขื‘ืจืช ื ืชื•ื ื™ื ื™ืฉื™ืจื”ื“ื•ืจืฉ ื”ืžืจื•ืช
ืกืจื™ืืœื™ื–ืฆื™ื” ื‘ื™ื ืืจื™ืชืžืชื•ื“ื•ืช ืžื•ื‘ื ื•ืช (.tobytes, .tofile)ื“ื•ืจืฉ ืฉื™ืžื•ืฉ ื‘-struct, pickle ื•ื›ื•'.

ืžืกืงื ื”:

๐Ÿš€ ื”ืฉืชืžืฉื• ื‘-array.array ื›ืืฉืจ ืืชื ืขื•ื‘ื“ื™ื ืขื ื›ืžื•ื™ื•ืช ื’ื“ื•ืœื•ืช ืฉืœ ื ืชื•ื ื™ื ืžืกืคืจื™ื™ื ื”ื•ืžื•ื’ื ื™ื™ื, ื•ื›ืืฉืจ ื‘ื™ืฆื•ืขื™ื ื•ืฉื™ืžื•ืฉ ื™ืขื™ืœ ื‘ื–ื™ื›ืจื•ืŸ ื”ื ืงืจื™ื˜ื™ื™ื ืขื‘ื•ืจื›ื.

ืœืจื•ื‘ ื”ืžืฉื™ืžื•ืช ื”ื™ื•ืžื™ื•ืžื™ื•ืช, ืฉื‘ื”ืŸ ื ื“ืจืฉืช ื’ืžื™ืฉื•ืช ื•ืื—ืกื•ืŸ ืฉืœ ื ืชื•ื ื™ื ื”ื˜ืจื•ื’ื ื™ื™ื, list ื ื•ืชืจ ื”ื‘ื—ื™ืจื” ื”ื˜ื•ื‘ื” ื‘ื™ื•ืชืจ.

ื›ืชื™ื‘ืช ืชื’ื•ื‘ื”

ื”ืื™ืžื™ื™ืœ ืœื ื™ื•ืฆื’ ื‘ืืชืจ. ืฉื“ื•ืช ื”ื—ื•ื‘ื” ืžืกื•ืžื ื™ื *