ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] Tip - 거대한 (대용량) 데이터를 함수로 처리할 때 고려할 점
    언어/파이썬 & 장고 2016. 10. 25. 14:16

    만약 리스트나 딕셔너리와 같은 컨테이너 타입에 10만, 100만 혹은 1억 이상의 데이터가 들어있다고 가정합니다. 이 부분자체에서 이미 엄청난 메모리를 소비합니다. 이러한 거대한 값이 들어있는 변수를 함수의 인수로 전달한다고 하면 어떤지 알아보겠습니다. 


    먼저 맨 처음 생각 한 것이 이 거대한 값이 들어있는 변수에 대한 메모리 주소공간을 전달하는 것이 아닌 값 자체를 전부 전달한다고 생각했습니다. 그래서 아래와 같이 생각을 해봤습니다.

    컨테이너 변수를 global 변수로 선언

    먼저 파이썬에는 글로벌 변수라는 것이 없습니다. (이 말은 모든 모듈을 자동적으로 사용할 수 있습니다.) 만약 있다 해도 글로벌 변수로 해당 데이터를 잡아버리면 프로그램이 죽을 때까지 거대한 메모리를 계속해서 잡고 있기 때문에 글로벌변수의 사용은 지양하는 것이 좋습니다.


    위와 같은 사실을 알게 되었고 검색한 결과 아래와 같은 특징을 가지고 있는 것을 확인할 수 있었습니다.

    파이썬 내부 정책

    파이썬은 함수의 인수로 데이터를 전달할 때 객체를 복사하지 않습니다. 파이썬 변수들은 객체를 가리키고 있는 이름들입니다. 그래서 함수의 변수로 전달이 될 때, 함수는 새로운 이름을 생성하고 해당 이름을 원본 객체의 메모리 주소를 가리키게 됩니다. 그래서 사용자는 복사본을 만들 필요 없이 읽고 수정하는 것이 가능합니다. (물론 다른 객체의 이름에 재바인딩을 하면 기존에 참조하던 객체를 더이상 변경할 수가 없습니다.)


    자세하게 알아봐야 하겠지만 컨테이너 타입을 함수의 인수로 넘길 경우 call by reference로 주소값을 넘겨 변수만 새로 재생성해 바인딩 하는 동작을 처리하고 기타 일반 변수들은 call by value로 값 자체를 넘겨받는 것으로 보입니다

    # -- 컨테이너 타입
     
    a = [1,2,3,4]
    def append_value(b):
        b.append(5)
    append_value(a)
    print(a)
     
    # 결과
    # [1,2,3,4,5]
     
    # -- 일반 타입
     
    a = 'abcd ef'
    def append_value(b):
        b += ' cccccc'
    append_value(a)
    print(a)
     
    # 결과
    # abcd ef


    댓글