ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ содСрТимому
davidka.net > πŸ’» 🧠 Код 1001 > πŸ“š Π£Ρ‡Π΅Π±Π½Ρ‹Π΅ ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ > 🐍 Python > πŸ§‘β€πŸ’» ИспользованиС array.arrayΒ Π² Python: ΠΊΠΎΠ³Π΄Π° ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ

πŸ§‘β€πŸ’» ИспользованиС array.arrayΒ Π² Python: ΠΊΠΎΠ³Π΄Π° ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ


In Questo Articolo
  1. πŸ“¦ ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ прСимущСства array.array
  2. πŸ”Ή Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ‚Π°Π±Π»ΠΈΡ†Π°: array.array vs list
  3. πŸ§‘β€πŸ’» ИспользованиС array.array Π² Python: ΠΊΠΎΠ³Π΄Π° ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ
  4. πŸ“¦ ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ прСимущСства array.array
  5. πŸ”Ή Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ‚Π°Π±Π»ΠΈΡ†Π°: array.array vs list

πŸ“¦ ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ прСимущСства array.array

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ array.array ΠΎΡ‚ list β€” ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎΠ΅ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…. ВмСсто списка ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Python, 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.
    """
    # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ списка с цСлочислСнными ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Python
    list_numbers = list(range(num_elements))
    
    # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ массива, Π³Π΄Π΅ числа хранятся ΠΊΠ°ΠΊ 4-Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ C-Ρ‚ΠΈΠΏΡ‹ int
    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:  {list_size / 1024 / 1024:.2f} MB")
    print(f"Π Π°Π·ΠΌΠ΅Ρ€ array: {array_size / 1024 / 1024:.2f} MB")
    if array_size > 0:
        print(f"Экономия памяти: {list_size / array_size:.2f}x")

# ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования
if __name__ == "__main__":
    compare_memory_usage()

Π’Ρ‹Π²ΠΎΠ΄:

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ элСмСнтов: 1000000
Π Π°Π·ΠΌΠ΅Ρ€ list:  7.63 MB
Π Π°Π·ΠΌΠ΅Ρ€ array: 3.82 MB
Экономия памяти: 2.00x

2. ΠŸΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ числовых ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ

Благодаря Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠΌΡƒ Ρ€Π°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ Π² памяти, матСматичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ элСмСнтами array.array Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ся быстрСС, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ процСссор ΠΌΠΎΠΆΠ΅Ρ‚ эффСктивнСС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ кэш.

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
    list_time = timeit.timeit("sum(list_data)", setup=setup_code, number=10)
    
    # Π˜Π·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ для array
    array_time = timeit.timeit("sum(array_data)", setup=setup_code, number=10)
    
    print(f"ВрСмя суммирования {num_elements} элСмСнтов (10 Ρ€Π°Π·):")
    print(f"list:  {list_time:.4f} сСкунд")
    print(f"array: {array_time:.4f} сСкунд")

# ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования
if __name__ == "__main__":
    compare_performance()

Π’Ρ‹Π²ΠΎΠ΄:

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ элСмСнтов: 10000000
Π Π°Π·ΠΌΠ΅Ρ€ list:  2.1106 сСкунд
Π Π°Π·ΠΌΠ΅Ρ€ array: 1.1549 сСкунд

3. ΠŸΡ€ΡΠΌΠ°Ρ Ρ€Π°Π±ΠΎΡ‚Π° с C-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ (ctypes, struct)

array.array ΠΈΠ΄Π΅Π°Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, написанныС Π½Π° 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) распаковываСт python-массив Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ этого конструктора
    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"Python array: {py_array}")
    print(f"C-совмСстимый массив (ctypes): {[val for val in c_array]}")

# ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования
if __name__ == "__main__":
    demonstrate_ctypes_usage()

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ со struct Π΄Π»Ρ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…:

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() ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ быстро ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ массив Π² Π±Π°ΠΉΡ‚Ρ‹ ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ идСально для сохранСния Π² Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΏΠΎ сСти.

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 ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сохраняСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈ создании. Π­Ρ‚ΠΎ Π·Π°Ρ‰ΠΈΡ‰Π°Π΅Ρ‚ ΠΎΡ‚ случайного добавлСния элСмСнтов Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

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() ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, позволяя ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠΉ сСриализации.

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
        print("Π¦Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½Π°.")

    finally:
        # Π“Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° послС выполнСния
        if file_path.exists():
            file_path.unlink()
            print(f"Π’Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» '{file_path}' ΡƒΠ΄Π°Π»Π΅Π½.")

# ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования
if __name__ == "__main__":
    work_with_binary_files()

πŸ”Ή Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ‚Π°Π±Π»ΠΈΡ†Π°: array.array vs list

Π₯арактСристикаarray.arraylist
Π’ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…ΠžΠ΄Π½ΠΎΡ‚ΠΈΠΏΠ½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ (числа, символы)Π›ΡŽΠ±Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Python
ΠŸΠ°ΠΌΡΡ‚ΡŒΠΠΈΠ·ΠΊΠΎΠ΅ потрСблСниСВысокоС ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅
ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΠ’Ρ‹ΡΠΎΠΊΠ°Ρ для числовых опСрацийНиТС для числовых ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ
APIΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²Π‘ΠΎΠ³Π°Ρ‚Ρ‹ΠΉ ΠΈ Π³ΠΈΠ±ΠΊΠΈΠΉ API
Π‘ΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с CВысокая, прямая ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π΄Π°Π½Π½Ρ‹Ρ…Π’Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ прСобразования
Бинарная сСриализацияВстроСнныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ (.tobytes, .tofile)ВрСбуСтся struct, pickle ΠΈ Ρ‚.Π΄.

Π’Ρ‹Π²ΠΎΠ΄:

πŸš€ Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ array.array, ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ с большими объСмами ΠΎΠ΄Π½ΠΎΡ‚ΠΈΠΏΠ½Ρ‹Ρ… числовых Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈ для вас ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Ρ‹ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ использованиС памяти.

Для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° повсСднСвных Π·Π°Π΄Π°Ρ‡, Π³Π΄Π΅ трСбуСтся Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΈ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Ρ€Π°Π·Π½ΠΎΡ€ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, list ΠΎΡΡ‚аСтся Π»ΡƒΡ‡ΡˆΠΈΠΌ Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ.

πŸ§‘β€πŸ’» ИспользованиС array.array Π² Python: ΠΊΠΎΠ³Π΄Π° ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ

ΠœΠΎΠ΄ΡƒΠ»ΡŒ array ΠΏΡ€Π΅Π΄ΠΎΡΡ‚авляСт спСциализированный Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… array.array Π΄Π»Ρ хранСния ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ ΠΎΠ΄Π½ΠΎΡ‚ΠΈΠΏΠ½Ρ‹Ρ… чисСл. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ list, массивы array.array ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅ эффСктивноС использованиС памяти ΠΈ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с числовыми Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.


πŸ“¦ ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ прСимущСства array.array

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ array.array ΠΎΡ‚ list β€” ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎΠ΅ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…. ВмСсто списка ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Python, 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.
    """
    # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ списка с цСлочислСнными ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Python
    list_numbers = list(range(num_elements))
    
    # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ массива, Π³Π΄Π΅ числа хранятся ΠΊΠ°ΠΊ 4-Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹Π΅ C-Ρ‚ΠΈΠΏΡ‹ int
    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:  {list_size / 1024 / 1024:.2f} MB")
    print(f"Π Π°Π·ΠΌΠ΅Ρ€ array: {array_size / 1024 / 1024:.2f} MB")
    if array_size > 0:
        print(f"Экономия памяти: {list_size / array_size:.2f}x")

# ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования
if __name__ == "__main__":
    compare_memory_usage()

Π’Ρ‹Π²ΠΎΠ΄:

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ элСмСнтов: 1000000
Π Π°Π·ΠΌΠ΅Ρ€ list:  7.63 MB
Π Π°Π·ΠΌΠ΅Ρ€ array: 3.82 MB
Экономия памяти: 2.00x

2. ΠŸΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ числовых ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ

Благодаря Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠΌΡƒ Ρ€Π°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ Π² памяти, матСматичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ элСмСнтами array.array Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ся быстрСС, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ процСссор ΠΌΠΎΠΆΠ΅Ρ‚ эффСктивнСС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ кэш.

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
    list_time = timeit.timeit("sum(list_data)", setup=setup_code, number=10)
    
    # Π˜Π·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ для array
    array_time = timeit.timeit("sum(array_data)", setup=setup_code, number=10)
    
    print(f"ВрСмя суммирования {num_elements} элСмСнтов (10 Ρ€Π°Π·):")
    print(f"list:  {list_time:.4f} сСкунд")
    print(f"array: {array_time:.4f} сСкунд")

# ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования
if __name__ == "__main__":
    compare_performance()

Π’Ρ‹Π²ΠΎΠ΄:

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ элСмСнтов: 10000000
Π Π°Π·ΠΌΠ΅Ρ€ list:  2.1106 сСкунд
Π Π°Π·ΠΌΠ΅Ρ€ array: 1.1549 сСкунд

3. ΠŸΡ€ΡΠΌΠ°Ρ Ρ€Π°Π±ΠΎΡ‚Π° с C-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ (ctypes, struct)

array.array ΠΈΠ΄Π΅Π°Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, написанныС Π½Π° 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) распаковываСт python-массив Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ этого конструктора
    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"Python array: {py_array}")
    print(f"C-совмСстимый массив (ctypes): {[val for val in c_array]}")

# ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования
if __name__ == "__main__":
    demonstrate_ctypes_usage()

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ со struct Π΄Π»Ρ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…:

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() ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ быстро ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ массив Π² Π±Π°ΠΉΡ‚Ρ‹ ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ идСально для сохранСния Π² Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΏΠΎ сСти.

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 ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сохраняСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈ создании. Π­Ρ‚ΠΎ Π·Π°Ρ‰ΠΈΡ‰Π°Π΅Ρ‚ ΠΎΡ‚ случайного добавлСния элСмСнтов Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

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() ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, позволяя ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠΉ сСриализации.

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
        print("Π¦Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½Π°.")

    finally:
        # Π“Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° послС выполнСния
        if file_path.exists():
            file_path.unlink()
            print(f"Π’Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» '{file_path}' ΡƒΠ΄Π°Π»Π΅Π½.")

# ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования
if __name__ == "__main__":
    work_with_binary_files()

πŸ”Ή Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ‚Π°Π±Π»ΠΈΡ†Π°: array.array vs list

Π₯арактСристикаarray.arraylist
Π’ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…ΠžΠ΄Π½ΠΎΡ‚ΠΈΠΏΠ½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ (числа, символы)Π›ΡŽΠ±Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Python
ΠŸΠ°ΠΌΡΡ‚ΡŒΠΠΈΠ·ΠΊΠΎΠ΅ потрСблСниСВысокоС ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅
ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΠ’Ρ‹ΡΠΎΠΊΠ°Ρ для числовых опСрацийНиТС для числовых ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ
APIΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²Π‘ΠΎΠ³Π°Ρ‚Ρ‹ΠΉ ΠΈ Π³ΠΈΠ±ΠΊΠΈΠΉ API
Π‘ΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с CВысокая, прямая ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π΄Π°Π½Π½Ρ‹Ρ…Π’Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ прСобразования
Бинарная сСриализацияВстроСнныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ (.tobytes, .tofile)ВрСбуСтся struct, pickle ΠΈ Ρ‚.Π΄.

Π’Ρ‹Π²ΠΎΠ΄:

πŸš€ Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ array.array, ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ с большими объСмами ΠΎΠ΄Π½ΠΎΡ‚ΠΈΠΏΠ½Ρ‹Ρ… числовых Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈ для вас ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Ρ‹ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ использованиС памяти.

Для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° повсСднСвных Π·Π°Π΄Π°Ρ‡, Π³Π΄Π΅ трСбуСтся Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΈ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Ρ€Π°Π·Π½ΠΎΡ€ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, list ΠΎΡΡ‚аСтся Π»ΡƒΡ‡ΡˆΠΈΠΌ Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ.

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *