티스토리 뷰

파이썬은 C언어나 기타 저급 언어에 비해서 느리다는 소리를 많이 들었다. 

 

예전에 왜 그런걸까 궁금해서 검색해보았더니,

한 질답 사이트에서 파이썬은 인터프리터 언어고, 저급언어는 컴파일 언어라서 그렇다는 답변을 보았다.

 

인터프리터 방식은 코드를 한 줄 한 줄 그 때 그 때 바꿔주는 통역과 같은 것이고

컴파일 방식은 코드 전체를 쫙 기계어로 번역을 한 뒤 실행을 하는 번역과 같은 것이라는 비유도 같이 첨언돼있었다.

 

왜 인터프리터가 컴파일보다 느리다는 건지도 모르겠고 통역도 번역도 해봤던 나로서는 비유마저 전혀 이해가 되지 않았다.

실제로 통번역을 해보면 통역 쪽이 일처리가 훨씬 빨랐기 때문이다. 

그렇다면 왜 그런 비유를 든걸까? 컴퓨터 세계에서는 번역이 더 빠른것일까? 구체적으로 좀 더 알아보기로 했다.


 

https://medium.com/@cookatrice/why-python-is-slow-looking-under-the-hood-7126baf936d7

 

Why python is Slow:Looking Under the Hood

파이썬은 왜 느릴까요? 내부 원리를 살펴 봅시다.

medium.com

조금 더 찾아보니 이런 글도 있었다. 굉장히 정리를 잘 해두셔서 많은 도움이 되었다.

내가 이해한 것을 정리해보자.

 

파이썬은 왜 느린가?

이유 1. 파이썬은 동적 타입 언어이기 때문

 동적 타입 언어란? 변수를 정의 할 때 그 자료형을 굳이 명시하지않아도 되는 언어다. 자료형에 따라 형태가 다르긴 하지만 C나 Java처럼 반드시 표기해줘야하는 정적 타입언어와는 성격이 다르다. 

자료형의 명시 여부가 처리 속도에 영향을 미치는 이유는 실행 중(런타임)에 변수 혹은 개체에 대한 자료형을 판단하는 처리 과정이 들어가기 때문이다. 간단한 예시를 보자.

C언어

int a = 1;

int b = 2;

int c = a + b;

파이썬

a = 1

b = 2

c = a + b

코드를 분석해보자.

 

C언어의 경우,

컴파일(이미 각 개체 자료형 판단 완료) -> a에 1을 할당 -> b에 2를 할당 -> 덧셈 루틴 호출 -> 결과를 c에 할당 // 끝

글로 써도 연산과정이 한 줄밖에 안 나올 정도로 간단하다.

 

하지만 파이썬의 경우,

개체 a에 1을 할당 -> a의 타입을 판단(정수) -> a의 값 = 1 설정 -> 개체 b에 2를 할당 -> b의 타입을 판단(정수) -> b의 값 = 2 설정 -> 덧셈 루틴 호출 -> a의 자료형 검색 -> a는 정수 -> b도 자료형 검색 -> b도 정수 -> 덧셈 루틴에 입력 ->정수형 결과값 도출 -> 개체 c 생성 -> c의 자료형을 정수로 설정 -> c에 덧셈한 결과값을 설정 // 끝

 

파이썬이 저급언어에 비해 거치는 과정이 더 복잡하다고는 들었지만 저급 언어를 배워본적이 없어 직접 확인해본건 이번이 처음이었다. 생각보다 거치는 과정이 많아 신기했다. 심지어 판단된 자료형을 다시 검색해서 찾아온다는 점이 더욱 느리게 만들어 주지 않았나 싶다. 

 

이유 2. 파이썬은 인터프리터 언어이기 때문

 

 위의 코드 예시는 동적/정적 타입 언어의 차이도 보여주지만 인터프리터/컴파일러 방식의 차이 또한 보여주고 있다.

 

 미리 준비해온 자료를 토대로 의견을 내는 회의(컴파일)

vs

 의견을 먼저 말한 뒤 그자리에서 노트북으로 뒷받침할 자료를 검색해서 제시하는 회의(인터프리터)

 

 둘 중 어느 회의가 더 빠르게 진행될 지는 굳이 설명이 필요없다고 본다.

 어째서 통역과 번역을 예시로 들었는지도 여기서 알 수 있었다. 통역을 하며 그 때 그 때 이야기하며 이해해가며 일을 처리하는 것보다 이미 번역이 끝난 자료로 사전에 정보를 숙지하여 일을 처리하는 것이 훨씬 빠르게 일이 처리된다는 것이다.

이유 3. 파이썬 개체 모델은 비효율적 메모리 액세스가 발생할 수 있기 때문

이 부분은 위의 링크된 블로그에서 몇번을 읽어봐도 잘 이해가 되지 않았지만 첫 단락만으로 이해를 해보자면,

위의 파이썬 코드 예시에서 보이는 '타입 판단' 및 '이미 판단한 타입을 검색'하는 등의 추가적인 과정이 메모리 사용량을 더 늘리고 있는 것이다. 즉 컴파일 언어라면 굳이 쓰지 않아도 될 메모리가 사용되고 있기 때문에 비효율적 메모리 액세스가 발생한다고 이야기하고 있다.

 

여담

 1. 왜 파이썬은 느린가? 에 대한 답은 이정도로 찾을 수 있겠다. 위 링크에는 좀 더 예시가 많았지만 지금은 왜 느린지에 대해 설명할 수 있는 정도로만 숙지하고 있는것만으로 충분하다고 생각한다. 더 알아보기엔 아직 내 배경지식이 너무 부족하기 때문에, 좀 더 강해져서 돌아온 뒤에 더욱 구체적으로 알아보고자 한다.

 

 2. 사실 이 의문에 대해서는 전에 지인에게 설명을 한 차례 들은 적이 있지만, 그때는 제대로 이해하지 못했다. 그저 고급 언어는 저급 언어보다 처리 속도가 느리다는 정도로 이해하고 넘어갔었다. 하지만 내가 무엇을 모르고 있는지를 파악하게 해주어 전보다 확실히 알게 되었기 때문에 내가 뭘 모르고 있는지 알게 해준 지인에게 감사하게 생각하고 있다. 그 지인은 결국 고급언어와 저급언어는 사람이 좀 더 편하게 일을하느냐, 컴퓨터가 좀 더 편하게 일을 하느냐를 선택하는 문제라고 얘기 했었다. 오늘 글을 쓰다보니 그게 무슨소리인지 좀 더 확실하게 알게 되었다. 

 

 3. 파이썬은 처리 속도는 비효율적이지만 작업 속도가 효율적이기 때문에 인기가 많다고 한다. 컴퓨터는 연산 처리하느라 죽어나겠지만 사람이 이해하기엔 쉽기 때문에 코딩작업을 하는데에는 이만한게 없다. 어차피 일은 사람이 하는 거고, 시간이 흐를 수록 하드웨어는 점차 발전해 처리속도로 인한 문제의 심각도는 옅어질 것이라 생각한다. 그러니 좀 더 파이썬이 메인으로 쓰이는 세상이 됐으면 좋겠다.

 

 4. 동적/정적 타입언어를 언급하다보니 강/약타입 언어에 대해서도 궁금해졌다. 이 건에 대해서는 나중에 또 포스팅을 해보도록 하겠다. 

 

 5. 파이썬의 이 단점을 극복해보고자 Cython등의 언어도 나왔다고 한다. 이에 대해서도 추후 포스팅해보도록 하겠다.

'Programming Language > Python' 카테고리의 다른 글

매개변수(parameter)와 전달인자(argument)  (0) 2020.02.23
191115 오늘의 깨달음  (0) 2019.11.15
공지사항
최근에 올라온 글