Python/Numpy

NumPy copy() vs view() 완벽 정리! 🧠 - 메모리와 성능까지 꿰뚫자

THINKRUNNER 2025. 4. 29. 21:36
NumPy copy() vs view() 완벽 정리! 🧠 - 메모리와 성능까지 꿰뚫자

NumPy copy() vs view() 완벽 정리! 🧠

1. 시작은 멘붕이었다... 🤯

처음엔 배열을 새로 복사한 줄 알았는데 원본까지 바뀌는 바람에 혼란이 왔어요. x = arr[1:3]은 독립체가 아니었습니다!

2. copy() vs view() 기본 개념 정리

  • copy(): 값을 완전히 복사한 독립체
  • view(): 메모리를 공유하는 연결된 사본
copy는 독립체, view는 연결된 쌍둥이! 👯

3. 왜 view()가 필요할까? 🤔

원본 전체를 복사하면 부담되니까요. 필요한 부분만 살짝 수정하거나 관찰하고 싶을 때 view가 탁월합니다!

4. 슬라이싱도 사실 view! 😲

arr = np.array([1, 2, 3, 4, 5])
x = arr[1:3]
x[0] = 999
print(arr)  # [1 999 3 4 5]

슬라이싱 = view! 새로운 배열을 만든 게 아닙니다!

5. .base 속성으로 원본 확인하기 🔍

x.base is arr  # True (view)
y = arr.copy()
y.base is None  # True (copy)

.base로 원본과 연결됐는지 바로 확인할 수 있어요.

copy()는 완전 독립체니까 이것 자체가 원본이라 따로 base가 없습니다.

6. view에서 수정하면 원본 수정됨 💥

view는 원본 메모리를 공유해요. 즉, view를 수정하면 원본이 바로 영향을 받아요. 마치 '한 몸에 여러 이름표를 붙인 것'과 같아요. 한쪽 이름표를 찢으면 몸도 상처를 입는 셈이죠. 🩹

copy는 완전 독립체니까(자체로 원본) 이 copy된 변수의 값을 수정해도 복사 대상과는 상관없으니 혼자만 바뀌죠.

7. 언제 copy(), 언제 view()? ⚡

  • copy()를 써야 할 때: 원본을 절대 수정하면 안 될 때
  • view()를 써야 할 때: 원본 일부만 관찰하거나 빠르게 작업할 때

8. copy()는 메모리 왜 무겁나? 🏋️

copy는 단순히 주소만 복사하는 게 아니라, 값 하나하나를 풀어서 새로운 메모리에 복사해요. 예를 들어 100만 개짜리 배열을 copy하면(단순 loop 형식으로 되어있어도), 100만 개를 전부 새로 만든다는 얘기! 📦📦📦

🎉 핵심 정리

view는 빠르고 가볍지만 원본을 건드릴 수 있다.
copy는 안전하지만 느리고 메모리 사용량이 크다.

작성일: 2025-04-25