python은 정말 느릴까?

개요

python은 사람들에게 보통 개발 속도가 빠른 대신 실행 속도가 느리다고 설명되어진다.
그래서 회사 서비스의 규모가 일정 수준을 넘어가면 java로 넘어가야 한다는게 일반적인 정설로 굳어졌다.
python 은 정말 느릴까? 수백, 수천만 유저를 감당하지 못해서 java 로 넘어가는것이 정말 합리적일까?
궁금해서 알아보았다.

느리다는건 뭘까?

속도는 상대적이다. 따라서 느리다는 개념도 상대적이다.
그렇다면 python이 느리다고 주장하는 사람들은 어떤 기준에서 python이 느리다고 말하는것일까?
java 와 비교해서 알아보도록 하겠다.

일반적인 벤치마킹

벤치마크 사이트에서는 다음과 같은 결과를 보여주었다.

👉🏻 펼쳐보기 click
regex-redux
source secs mem gz busy cpu load
Python 3 1.36 111,852 1403 2.64 32% 40% 33% 88%
Java 5.31 793,572 929 17.50 79% 78% 83% 89%
pidigits
source secs mem gz busy cpu load
Python 3 1.28 12,024 567 1.29 0% 1% 100% 0%
Java 0.93 36,088 764 0.97 4% 0% 1% 99%
reverse-complement
source secs mem gz busy cpu load
Python 3 7.20 1,005,184 814 10.75 20% 53% 48% 29%
Java 1.53 687,864 2183 3.50 80% 46% 57% 46%
k-nucleotide
source secs mem gz busy cpu load
Python 3 46.28 241,108 1967 176.42 94% 97% 95% 96%
Java 4.85 354,288 1812 15.92 80% 85% 87% 76%
binary-trees
source secs mem gz busy cpu load
Python 3 48.03 462,732 472 174.44 89% 97% 88% 89%
Java 2.48 1,725,776 835 7.86 74% 75% 97% 72%
fasta
source secs mem gz busy cpu load
Python 3 37.32 846,264 1947 71.03 10% 67% 83% 30%
Java 1.19 44,740 2543 3.50 75% 63% 87% 70%
fannkuch-redux
source secs mem gz busy cpu load
Python 3 352.29 12,232 950 1,392.10 97% 99% 100% 99%
Java 10.38 35,388 1282 40.84 99% 99% 98% 97%
mandelbrot
source secs mem gz busy cpu load
Python 3 163.32 12,080 688 642.00 98% 98% 98% 98%
Java 4.12 70,952 796 16.22 98% 98% 98% 99%
spectral-norm
source secs mem gz busy cpu load
Python 3 120.99 13,424 407 479.86 99% 99% 99% 99%
Java 1.58 39,408 756 5.97 94% 94% 96% 94%
n-body
source secs mem gz busy cpu load
Python 3 567.56 8,076 1196 570.95 0% 0% 0% 100%
Java 6.77 35,432 1489 6.82 100% 1% 0% 0%
Python 3 Python 3.9.2
Java openjdk 17 2021-09-14
OpenJDK Runtime Environment (build 17+35-2724)
OpenJDK 64-Bit Server VM (build 17+35-2724, mixed mode, sharing)

실제로 정규표현식을 제외하고는 압도적으로 java 가 더 빠르다. 그렇다면 이런 차이가 벌어지는 이유는 무엇일까?

속도 차이의 원인

Complier

속도 차이의 가장 큰 원인 중 한 가지는 컴파일 방식이다.
JavaJIT compiler 로 컴파일을 하고 python 의 여러가지 런타임 중 공식이라고 볼 수 있는 CPython 구현체의 경우는 interpreter 방식의 스크립트 언어이므로 속도에 차이가 발생한다.
하지만 python 의 또 다른 구현체인 pypy 의 경우에는 CPython 과 호환되며 JIT compiler 로 컴파일을 한다. 최근 작성된 다른 한 블로그에 의하면 pypy 3.7 의 성능이 java 8 보다 빠르거나, 근소한 차이로 느리다고 작성된 것을 확인할 수 있다.

GIL (Global Interpreter Lock)

python 에서는 멀티쓰레딩을 지원하기 위해 GIL(Global Interpreter Lock)을 사용한다.
하지만 GIL 특성상 실제로는 동시에 한가지 작업만 할 수 있기 때문에 쓰레드를 10개를 만들어도 단순 루프에서는 싱글스레드보다 느린 퍼포먼스가 나온다.

그럼 자바가 더 빠르네?

단순 루프와 같은 일반적인 상황에서는 java 가 훨씬 빠르다.
하지만 우리는 단순히 100만번 +1 하며 돌아가는 루프같은 코드를 대부분 작성하지는 않는다.

여러 목적의 python

데이터 사이언스

pythonR 과 함께 데이터 사이언스 분야에서 가장 많이 사용되는 언어이다.
데이터 사이언스는 주로 엄청나게 많은 데이터를 처리하는 로직이 작성된다.
numpypandas 같은 C 로 작성된 고성능 계산 라이브러리와 함께 사용하기 때문에 많은 데이터를 처리해야하지만 속도 이슈 때문에 다른 개발 언어를 고려하지는 않는다.

머신러닝

머신러닝에서 가장 많이 사용되는 tensorflowpytorch 와 같은 프레임워크들도 데이터 사이언스와 마찬가지로 고성능 작업이 필요하지만 중요한 병렬 연산은 CUDA 와 같은 소프트웨어가 도와주므로 속도 문제 없이 사용된다.

웹 어플리케이션 서버

python 으로 작성된 fastapijava 로 작성된 spring 의 multiple queries 벤치마크를 비교해보았다.
fastapi 는 183위, spring 은 122위로 20% 정도의 성능 차이를 확인할 수 있다.
하지만 아래와 같은 여러 가지 상황이 있기 때문에 단순히 벤치마크만으로 java 가 빠르기 때문에 더 좋다고 단정할 수 는 없다.

  • 오버 트래픽이 발생할 때 스케일 업이 빠른가?
  • serverless 아키텍쳐를 활용하는 경우 오히려 JIT compiler 로 인해 초기 오버헤드가 발생하기 때문에 cold start 가 더 느리다.
  • 동일한 성능의 ec2 의 경우 java 웹 서버의 aws 사용 금액이 더 비싸다
  • 웹 서버에서 어플리케이션 병목이 차지하는 비율은 크지 않다. (대부분 DB 병목)

기업이 java 로 전향하는 이유

한국의 경우 python 시니어 개발자보다 java 시니어 개발자가 월등히 많기 때문에 구인이 용이한 java 로 전향했을 가능성이 크다고 생각한다.

결론

단순 알고리즘 로직에서는 성능 차이가 발생하지만 python 에서 무거운 작업을 수행할때는 대부분 C 로 작성된 고성능 라이브러리를 사용하기 때문에 성능상 문제가 발생할 일이 거의 없다.
트래픽을 감당하지 못한다면 비즈니스 로직이 최적화 되지 않았거나 아키텍쳐에 문제가 있을 가능성이 높다.
국내에도 많은 python 개발자들이 양성되었으면 좋겠다.


[joon hwan]
Written by@[joon hwan]
Interested with python, django, serverless architecture, machine learning. I love Automation, development website or web service.

GitHubLinkedIn