이진(Binary), 텍스트(Text), NumPy 전용 Binary 저장 비교 (260517)

WonTerry·3일 전

Python

목록 보기
6/9

다음은 파이썬에서 천만(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배 큼


profile
Hello, I'm Terry! 👋 Enjoy every moment of your life! 🌱 My current interests are Signal processing, Machine learning, Python, Database, LLM & RAG, MCP & ADK, Multi-Agents, Physical AI, ROS2...

0개의 댓글