Java와 Python의 실행속도 차이의 이유는?

LSM ·2022년 1월 28일
1

나는 코딩테스트 준비를 위해 본인은 Java와 Python으로 주로 연습하는 편이다.
오늘 프로그래머스에서 '멀쩡한 사각형'이라는 문제를 풀고 python의 실행 속도가 자바에 비해 굉장히 느림을 한번 더 느낄 수 있었다.물론 로직은 같았다.
이해를 돕기 위해 실행 결과의 그림을 첨부 하겠다.

  • 먼저 파이썬 코드의 결과이다. 13,15,17번이 주로 많은 시간을 요구하는 테스트인 듯하다.
  • 자바로 실행한 결과이다.

실행속도의 차이는 실감할 수있을 것이라 생각이 된다. 그렇다면 자바와 파이썬의 특징에 대해 설명하면서 왜이렇게 속도가 차이가 나는가에 대해 설명하겠다.


먼저, 자바는

일반적으로 C, C++보다 느리고, Python보다 수행 속도가 빠르다.

일괄 컴파일 방식 언어인 C, C++의 코드는 컴파일만 하면 바로 CPU에서 실행이 가능한 코드인 기계어로 변환된다. 즉 코드의 object파일을 바로 생성하여 이를 메모리에 적재하고 사용한다.

반면 자바 같은 경우 컴파일을 해서 바이트 코드(byte code)를 생성하고, jvm에서 그 바이트 코드(byte code)를 기계어(native code)로 변환하는 시간을 필요로 하기 때문에 일괄 컴파일 방식보다 수행 속도가 더 오래 걸린다. 추가적으로 자바는 컴파일 방식과 인터프리터 방식을 혼합한 JIT 방식을 사용한다.

아래 그림을 보면 조금 더 위 글의 의미가 와 닿을 것이라 생각한다.


그렇다면 파이썬은?

전부를 적을 수는 없겠지만 필자가 이해하고 알고있는 2가지 이유를 통해 파이썬이 느린 이유를 적어보겠다.

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

a = 1
b = 2
c = a + b

파이썬은 타입 선언의 생략이 가능하다. 그럼 이는 내부적으로 어떻게 동작하는가?

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

이 같이 간단한 코드도 자료형을 알기 위해 계속적인 검색과정이 필요하다. 느릴수 밖에...

2. 파이썬은 인터프리터 언어이다.

컴파일 언어는 위에서도 언급했듯이 메모리에 접근해 바로 os에서 기계언어로 해석이 가능하게 컴파일시 하나의 객체 파일을 생성하여 적재한다. 즉 컴파일러는 한꺼번에 컴파일을 하기 때문에 컴파일 시간은 오래걸리지만 목적프로그램을 실행할때는 컴파일을 하지 않아 속도가 월등히 빠르다. 추가적으로 컴파일타임에 오류검출이 가능하다는 장점도 있다~

반면 파이썬과 같은 인터프리터는 라인별로 컴파일을 하기 때문에 라인을 컴파일 하는 시간이 짧지만 프로그램을 실행하는 동안 컴파일 작업도 같이 하기 때문에 프로그램 자체의 속도는 느리다. 그럼에도 인터프리터 언어를 사용하는 이유는 다양한데, 뭐.. 편리성, 한 줄 단위로 컴파일을 하기에 디버깅시 유리하다는 점, OS별 이식성이 높다는 점이 있기에 사용된다.


결론

지금까지 자바와 파이썬의 특징을 언급하며 각 언어가 프로그램을 실행하는데 다른 언어에 비해 비교적 빠르거나 느린 이유를 알아보았다.

상황에 맞게 언어를 자유자재로 구현할 수 있는 개발자가 되어야 함을 느낄 수 있었다.

profile
개발 및 취준 일지

2개의 댓글

comment-user-thumbnail
2023년 8월 11일

분석 글 잘 봤습니다.

답글 달기
comment-user-thumbnail
2024년 3월 30일

좋은 글 잘 봤습니다!

답글 달기