다음은 파이썬에서 천만(10,000,000) 개의 숫자 배열을:
아래 3가지를 모두 비교합니다.
tofile() → 순수 Binary 저장
np.save() → NumPy 전용 Binary 저장
savetxt() → Text 저장
그리고 각각에 대해:
저장 시간
읽기 시간
파일 크기
속도 배율
을 모두 비교합니다.
실무에서는 왜 .npy를 많이 쓰는가?
실제로 NumPy 배열은 단순 숫자 덩어리가 아닙니다.
배열에는:
dtype
shape
strides
endian
등 메타데이터가 필요합니다.
.npy는 이것들을 안전하게 저장해줍니다.
import numpy as np
import time
import os
# -----------------------------------
# 데이터 생성
# -----------------------------------
print("데이터 생성 중...")
arr = np.arange(10_000_000, dtype=np.int32)
print("생성 완료")
print()
# -----------------------------------
# Binary 저장
# -----------------------------------
print("===== Binary 저장 =====")
start = time.perf_counter()
arr.tofile("numbers.bin")
binary_write_time = time.perf_counter() - start
binary_size = os.path.getsize("numbers.bin") / (1024 * 1024)
print(f"저장 시간: {binary_write_time:.4f}초")
print(f"파일 크기: {binary_size:.2f} MB")
print()
# -----------------------------------
# Binary 읽기
# -----------------------------------
print("===== Binary 읽기 =====")
start = time.perf_counter()
loaded_bin = np.fromfile("numbers.bin", dtype=np.int32)
binary_read_time = time.perf_counter() - start
print(f"읽기 시간: {binary_read_time:.4f}초")
print(f"데이터 개수: {len(loaded_bin):,}")
print()
# -----------------------------------
# Text 저장
# -----------------------------------
print("===== Text 저장 =====")
start = time.perf_counter()
np.savetxt("numbers.txt", arr, fmt="%d")
text_write_time = time.perf_counter() - start
text_size = os.path.getsize("numbers.txt") / (1024 * 1024)
print(f"저장 시간: {text_write_time:.4f}초")
print(f"파일 크기: {text_size:.2f} MB")
print()
# -----------------------------------
# Text 읽기
# -----------------------------------
print("===== Text 읽기 =====")
start = time.perf_counter()
loaded_txt = np.loadtxt("numbers.txt", dtype=np.int32)
text_read_time = time.perf_counter() - start
print(f"읽기 시간: {text_read_time:.4f}초")
print(f"데이터 개수: {len(loaded_txt):,}")
print()
# -----------------------------------
# 최종 비교
# -----------------------------------
print("===== 최종 비교 =====")
print(f"Binary 저장 속도: {binary_write_time:.4f}초")
print(f"Text 저장 속도 : {text_write_time:.4f}초")
print()
print(f"Binary 읽기 속도: {binary_read_time:.4f}초")
print(f"Text 읽기 속도 : {text_read_time:.4f}초")
print()
print(f"Binary 파일 크기: {binary_size:.2f} MB")
print(f"Text 파일 크기 : {text_size:.2f} MB")
print()
# -----------------------------------
# 속도 비율 계산
# -----------------------------------
print("===== 성능 비율 =====")
print(f"Text 저장은 Binary보다 "
f"{text_write_time / binary_write_time:.1f}배 느림")
print(f"Text 읽기는 Binary보다 "
f"{text_read_time / binary_read_time:.1f}배 느림")
print(f"Text 파일 크기는 Binary보다 "
f"{text_size / binary_size:.1f}배 큼")
데이터 생성 중...
생성 완료
===== Binary (.bin) 저장 =====
저장 시간: 0.0038초
파일 크기: 38.15 MB
===== Binary (.bin) 읽기 =====
읽기 시간: 0.0038초
데이터 개수: 10,000,000
===== NumPy (.npy) 저장 =====
저장 시간: 0.0035초
파일 크기: 38.15 MB
===== NumPy (.npy) 읽기 =====
읽기 시간: 0.0060초
데이터 개수: 10,000,000
===== Text (.txt) 저장 =====
저장 시간: 2.7443초
파일 크기: 75.23 MB
===== Text (.txt) 읽기 =====
읽기 시간: 0.1522초
...
===== 파일 크기 배율 =====
Text 파일은 Binary보다 2.0배 큼
Text 파일은 NumPy보다 2.0배 큼