ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Copy() 메서드
    Data Engineer 2023. 12. 3. 22:40
    728x90

    기본적으로 얕은 복사를 수행.

    • 얕은 복사는 객체 자체를 복사하지만, 내부 객체(리스트, 딕셔너리)는 참조로 유지
    • 내부 객체까지 새롭게 복사하고 싶은 경우 copy 모듈의 copy.deepcopy() 를 사용해야 한다

     

    복사 작업의 오버헤드

    : 많은 양의 데이터를 다루는 경우, copy() 작업이 오버헤드를 초래할 수 있다.

    특히 큰 데이터 구조를 자주 복사해야 하는 경우 성능에 영향을 미칠 수 있다.

     

    가비지 컬렉션 및 메모리 사용

    : 많은 객체가 생성되면 가비지 컬렉션의 작업이 늘어날 수 있다. 불필요한 객체가 많이 생성되면 메모리 사용량이 증가한다

     

    불변 객체

    : 숫자, 문자열과 같은 불변 객체인 경우 copy() 작업은 필요하지 않을 수 있다. 불변 객체는 값을 변경할 수 없기 때문에 일반적으로 복사가 필요하지 않다.

     

    Copy()를 사용해야 할때는 얕은 복사인지, 깊은 복사인지, 그리고 성능에 미치는 영향을 고려해야 한다.

    불필요한 복사 작업을 피하고, 필요한 경우에만 적절한 복사 방식을 선택하는 것이 좋다

     

    메모리와의 연관성

    1. 얕은 복사와 메모리

    • Copy() 메서드를 수행하게 되면 얕은 복사가 수행된다.
    • 얕은 복사는 객체 자체를 새로운 객체로 복사하지만, 내부 객체는 참조로 유지된다
    • 이로 인해, 복사된 객체와 원본 객체가 메모리를 공유할 수 있으며, 내부 객체가 가변 객체인 경우에 하나의 객체를 수정하면 다른 객체에도 영향을 미칠 수 있다

    2. 깊은 복사와 메모리

    • Copy 모듈의 deepcopy() 메서드를 사용하면 깊은 복사가 수행된다. 깊은 복사는 객체와 내부 객체까지 새로운 객체로 모두 복사되며, 이로 인해 깊은 복사된 객체는 완전히 독립적인 메모리를 사용하게 된다.

    3. 불필요한 메모리 사용

    • copy() 메서드나 deepcopy() 메서드는 새로운 객체를 생성하므로 메모리 사용량이 늘어날 수 있다. 특히 큰 데이터 구조를 다루는 경우, 불필요한 복사 작업은 성능에 영향을 미칠 수 있다. 따라서 불필요한 복사를 피하기 위해 얕은 복사나 깊은 복사를 수행하기 전에 신중하게 고려해야 한다.

     

    Python의 메모리 관리 방식

     

    파이썬은 파이썬 코드를 컴퓨터의 언어인 0과 1로 구성된 파일로 변환시키는 컴파일링과 한줄한줄 읽으며 해석하는 인터프린팅을 혼합하여 사용한다.

    코드를 작성하고 실행 버튼을 누르게 되면 파이썬 코드는 컴퓨터 언어인 0과 1로 구성된 바이트코드로 변하게 된다.

     

    코드 작성 > 실행  > Python code는 컴퓨터의 언어인 0과 1로 구성된 바이트 코드로 변하게 된다 (Compile Time)

     

    변환된 바이트 코드는 메모리에 올라가 차례차례 실행이 된다.

    이러한 과정을 인터프린팅 혹은 런타임이라고 하며, 

    런타임 때 파이썬은 바이트코드를 python virtual machine이라는 가상 컴퓨터에서 실행을 하게 한다.

     

    외부 모듈의 경우 가상 머신이 만들어지고, 바이트 코드를 해석할 때 추가된다.

     

    Cpython, pypy, ironpython : 대표적인 Python Interpreter

     

     

    정적 메모리 할당

    • 코드들이 컴파일 시간에 할당되는 것
    • 정적 메모리를 구현하기 위해서 stack 자료 구조를 사용
    • 프로그램에 사용할 데이터를 stack에 저장해두었다가 하나씩 꺼내어 사용
    • 프로그램이 종료될 때까지 없어지지 않는 특징

     

    Stack 자료 구조의 경우 데이터 저장시 차곡차곡 쌓아 올린다. 

     

    동적 메모리 할당

    • 코드가 실행이 되고 나서 메모리에 할당되는 것
    • Heap 자료구조를 이용
    • 정적과 달리 데이터가 나중에 필요하지 않으면 메모리에서 제거 가능

     

    Python에서는 정적 메모리에 정의된 함수와 변수의 이름들이 들어가며 힙 영역에는 모든 오브젝트들이 들어간다.

    이 모든 정보는 cpython에 구현되어 있으며, cpython은 python을 OS에 실행하기 위해 필요한 c언어 기반 프로그램이다.

     

     

    Python 인터프리터는 실행 버튼을 누르면 기본적인 세팅을 진행한다.

    위에서 아래로 한 줄씩 읽으며 코드를 이해하고, 

    Cpython: 레퍼런스를 메모리 주소 값을 이용하여 구현

    A = 3이면 변수의 레퍼런스와 오브젝트를 생성하여 스택과 힙에 올려놓는다.

     

    Immutable : 정수형

     

    이경우 Python은 오브젝트의 레퍼런스가 0인 오브젝트를 삭제하여 메모리 낭비를 줄인다.

     

    Int, float, bool, str, tuple, unicode, bytes의 경우 immutable 오브젝트

    > 메모리에 올라간 정수형 객체는 변경이 불가능하여, 이들은 object 변화 없이 reference만 변경된다. <Interning>

     

    List, bytearray, collection, deque, dictionary : Mutable 타입

    오브젝트의 메모리 주소 값만 알면 변경이 가능하다.

    예제 1의 경우 스트링 연산이 존재하지 않지만, 예제 2는 스트링 연산이 존재한다.

    예제 1은 컴파일 과정에서 파이썬 오브젝트들을 효율적으로 힙 메모리에 배열한 상태이지만, 예제 2는 로컬 변수 dummy가 계산을 해야 하는 대상이 되버린다. 

     

    그 이유는 로컬변수의 경우 함수가 실행될 때 생성되고 종료될 때 삭제되지만, 함수의 실행은 런타임 과정에서 처리하기 때문이다.

    Binary_add 연산이 런타임에 진행된다는 말은 최적화 코드를 사용하지 못한다는 뜻으로, 피할 수 있다면 피하는 것이 좋다

     

    메모리를 효율적으로 관리하는 방법

    1. 제너레이터 사용 : yield를 이용해 하나씩 리턴

    실버보다 골드가 메모리를 2배 더 적게 사용할 수 있다.

    2. 로컬 함수에 다시 선언하기 : Python은 글로벌 보다 로컬 변수가 훨씬 빠르므로, 함수를 로컬에 다시 정의하면 빠르게 사용할 수 있다.

    3. 구현되어 있는 함수나 라이브러리를 사용하자 : 구현되어 있는 라이브러리를 찾는 습관이 병행된다면 좋은 습관이다. 

    4. Itertools 이용하기

    루프의 시간도 줄이며, 읽기도 편하다

     

     

    파이썬 인터프리터가 어떻게 작동할지?

    구현된 것들을 찾아보는 습관

    컴파일 타임에 작동하는 코드인지, 런타임에 작동하는 코드인지 생각하는 습관

    728x90

    'Data Engineer' 카테고리의 다른 글

    정형, 비정형, 반정형  (0) 2023.12.15
    concurrent.futures  (2) 2023.12.07
    동기 작업과 비동기 작업  (1) 2023.12.03
    Airflow 연결 오류  (0) 2023.11.08
    Spark Structured Streaming_1  (1) 2023.10.29
Designed by Tistory.