ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python?
    Python 2020. 12. 21. 21:31

    왜?

    작년 가을 교양 프로그래밍 수업을 들으며 Python을 처음으로 접하고, 3개월 전 부터 본격적으로 공부를 해왔다.

    파이썬을 사용하며 더 깊이 알아보려 하고, 의문을 가졌던 적이 별로 없다. 

     

    나무 자르기(포스팅) 문제를 풀면서 파이썬에서 함수를 사용하는 경우에 속도가 더 빠른 경우를 접하게 되었다. 이 당시에는 단순히 백준 사이트의 문제라고 생각하고 넘어갔었다. 그런데, 오늘 함수를 사용했을 때, 더 빠른 상황을 다시 한 번 접하게 되었고 왜 이런 현상이 발생하는 것인지 굉장히 궁금해 졌다.

     

    인터넷의 자료를 찾아봐도 시원하게 해결해 주는 곳이 없었기에, 파이썬을 기초부터 차근차근 다지며 알아가보려 한다. 수면 아래의 굉장히 거대한 빙산이 드러나는 느낌인데, 두려워하지 않고 오늘 부터 파해쳐 나가야겠다.

     

    함수 내에서 지역변수를 사용했을 때, 더 빨랐다.

    import time
    
    start = time.time()
    x=1
    def func():
        global x
        for i in range(1000000):
            x *= 2
            x //= 2
    func()
    print('%.10f - function with global variable\n'%(time.time() - start))
    
    start = time.time()
    def func():
        y = 1
        for i in range(1000000):
            y *= 2
            y //= 2
    func()
    print('%.10f - function with local variable\n'%(time.time() - start))
    
    start = time.time()
    z = 1
    for i in range(1000000):
        z *= 2
        z //= 2
    print('%.10f - without function with global variable\n'%(time.time() - start))

    백준 사이트에서 뿐만이 아니라 실제로 실험을 해봐도 함수내에서 지역변수를 사용할 때가 실행 속도가 더 빨랐다.

     

    현재까지의 추측으로는 전역변수와 지역변수가 메모리에 저장되는 영역의 차이가 원인인 것 같은데 정확히 알아봐야겠다.

     

     

     

    메모리 영역

     

    메모리 할당

    메모리 영역은 크게 Code Segment, Data Segment, Stack Segment, 그리고 Heap Segment로 나뉜다.

     

    각 영역에 어떤 정보들이 저장되는지 알아보자.

     

    Code Segment

     

    파일의 프로그램에 대한 전체적인 코드가 올라가는 영역이다. 컴파일 단계에서 크기가 결정되며, 중간에 크기를 바꿀 수 없도록 read only로 저장되게 된다!

     

    Data Segment

     

    코드 내에서 선언한 Global Variables와 Static Variables가 저장된다. 이 변수들은 프로그램이 실행되는 동안 값이 변경될 수도 있어 read & write로 저장된다. (초기화 되지 않은 Global Variables는 BSS에 별도로 할당된다.)

     

    Stack Segment

    함수내의 Local Variable들이 저장되는 영역이다. 

    함수의 특성상 스택 구조로(선입 후출) 호출되고 반환된다. 때문에, 스택의 구조를 활용해서 Local variable의 메모리를 관리하게 된다.

    컴파일 시에 크기가 결정되기 때문에 일정 범위를 벗어나면, 그 유명한 Stack Overflow 에러가 발생하게 된다.

     

    Heap Segment

    Heap은 다른 영역들과 달리 런타임 시에 결정되는 영역이다. Code, Data, Stack Segments들을 모두 할당하고 남은 공간이며, 동적 할당을 통해 생성된 동적 변수들이 이 영역에서 관리된다. 

    Data 와 Stack Segment들은 컴파일러가 미리 예측해 공간을 할당할 수 있지만, 동적 변수는 예측이 힘들기 때문에 Runtime 중에 크기가 결정되게 된다.

    Heap도 범위가 무한하지 않기 때문에 범위를 벗어나게 되면 Heap Overflow 에러가 발생한다.

     

     

    추가로 알아봐야 할 것들 

    • 인터프리터, 컴파일러
    • Global Interpreter Lock, Thread
    • 파이썬에서의 변수 - Local variable, Global variable

    'Python' 카테고리의 다른 글

    cPython [Deep Dive to Object] - 1  (0) 2021.04.21
    Python - Variable Scope  (0) 2021.01.06
    Python - Call by Object Reference  (1) 2020.12.26
    Python - 함수에 배열을 인자로 전달할 때  (0) 2020.12.23
Designed by Tistory.