ืืืืืื array ืืกืคืง ืืืคืืก ื ืชืื ืื ืืืขืืื, array.array, ืืืืกืื ืจืฆืคืื ืฉื ืืกืคืจืื ืืืืืื ืืื (ืืืืชื ืกืื). ืื ืืืื ืืืืคืืก ืืืืื list, ืืขืจืื 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.array | list |
|---|---|---|
| ืืืคืืก ื ืชืื ืื | ืืืคืืกืื ืคืจืืืืืืืืื ืืืืืืื ืืื (ืืกืคืจืื, ืชืืืื) | ืื ืืืืืืงื ืคืืืชืื |
| ืืืืจืื | ืฆืจืืื ื ืืืื | ืฆืจืืื ืืืืื |
| ืืืฆืืขืื | ืืืืืื ืืคืขืืืืช ื ืืืจืืืช | ื ืืืืื ืืืชืจ ืืคืขืืืืช ื ืืืจืืืช |
| API | ืกื ืืืืื ืฉื ืืชืืืืช | API ืขืฉืืจ ืืืืืฉ |
| ืชืืืืืช ื-C | ืืืืื, ืืขืืจืช ื ืชืื ืื ืืฉืืจื | ืืืจืฉ ืืืจืืช |
| ืกืจืืืืืืฆืื ืืื ืืจืืช | ืืชืืืืช ืืืื ืืช (.tobytes, .tofile) | ืืืจืฉ ืฉืืืืฉ ื-struct, pickle ืืื'. |
ืืกืงื ื:
๐ ืืฉืชืืฉื ื-array.array ืืืฉืจ ืืชื ืขืืืืื ืขื ืืืืืืช ืืืืืืช ืฉื ื ืชืื ืื ืืกืคืจืืื ืืืืืื ืืื, ืืืืฉืจ ืืืฆืืขืื ืืฉืืืืฉ ืืขืื ืืืืืจืื ืื ืงืจืืืืื ืขืืืจืื.
ืืจืื ืืืฉืืืืช ืืืืืืืืืืช, ืฉืืื ื ืืจืฉืช ืืืืฉืืช ืืืืกืื ืฉื ื ืชืื ืื ืืืจืืื ืืื, list ื ืืชืจ ืืืืืจื ืืืืื ืืืืชืจ.