Java vs Python: 왜 데이터 가공에 파이썬을 쓰는가

2021. 7. 17. 16:19Web


python은 데이터 타입, 반환값 같은걸 알아서 처리해주기도 하고, '원래 무거우니까'라는 인식 때문에 별 생각 없이 사용했다.

특히 데이터 처리에서 20*10000같은 리스트도 '5분뒤에 오면 다 되겠지 뭐^^ 쉬다와야지~' 식으로 작업해서... 되돌아보니 요즘 말로 무지성 개발을 했다.

 

이 말을 하는건 java의 배열이 메모리상으로는 전부 1차원이란 이야기를 들어서인데, 사실 처음 들은 건 아닐꺼다.

귓등으로 들었겠지.

그래서 java와 python의 배열, 리스트 비교와 왜 python은 그럼에도 불구하고 고차원 리스트 처리를 하는데 쓰이게됐는지 알고싶어졌다.


왜 파이썬은 느릴까?(C와 비교)

 

Why Python is Slow: Looking Under the Hood란 문서를 통해 python과 C를 비교해서 왜 python이 느린지 요약해본다.

 

파이썬의 특징

-인터프리터식

-객체지향

-동적 타이핑

 

이유 1: 동적 타이핑

c나 java는 변수 선언 시점에 데이터 타입을 지정한다. 근데 python은 아니다. 이건 코딩 중엔 편하긴 하지만 인터프리터 입장에서는 이놈을 객체로 처리해야한다. 정수형 1을 객체로 처리할 때의 자원 낭비를 생각하니 눈물이 다 난다. 돈으로 비유하면 시발비용쯤 될 것 같다.

 

예를 들어 숫자 1을 입력한다 쳤을 때 인터프리터는 이런 과정을 거친다.

객체(1)입력                ---> 누구시죠?                     ---> 아 정수시구나!
  PyObject_HEAD확인 typecode를 정수로

내부적으로 연산이 훨씬 많다는 것이 동적 타이핑 언어가 느린 주된 이유다.

 

이유 2: 리스트, 배열의 주소 방식 차이

C언어는 배열을 메모리에 올릴 때 덩어리채로 올린다. array이란 배열의 주소값이 0x00000~0x00009처럼 연속된다는 말이다. 그렇다면 당연히 해당 배열의 시작주소인 0x00000만 알면 배열 요소 접근을 할 수 있다.

 

python은 리스트의 주소값이 연속적이지 않다. list[0]의 주소값은 0x00010인데 list[1]의 주소는 0x00005이거나 0x01234가 될 수 있다. 이렇게 규칙성 없는 주소 가진 리스트의 요소에 접근하기 위해서는 각 요소의 주소를 가진 포인터 버퍼가 필요하다. 

 

따라서 python은 c보다 거치는 단계가 많다.

 

그럼에도 불구하고

느리지만 편리하다. 느린건 컴퓨터의 문제지 개발자의 문제가 아니다. 많은 양의 데이터를 처리해야하는 경우, 코드를 후다닥 짜버리고 그래픽카드에게 모든 걸 맡겨버리고 개발자는 드라마도 보고, 웹툰도 보고, 다른 일 좀 하다가 돌아오면 되는 거다. 물론 극단적인 예시다. AI 쪽은 저렇게 3일을 돌리다가 컴퓨터가 나가서 다시 돌린다는 한탄이 자주 들려온다. 근데 짜는데 사흘, 학습에 하루나 짜는데 하루 학습에 사흘이면 난 후자가 좋다. 이래서 파이썬을 선택하는거겠지.

 

JAVA와 Python비교

또잉 java보다 python이 오래된 언어라고 한다. 그럼 더 의문이다. 왜 파이썬은 새로운 기술로 발표되거나한 것도 아닌데 초신성 수준으로 java를 제치고 부상하고 있느냐.(참고 포스트를 보니 github에서 점유율이 4년 연속python 2위, java 4위라고 한다.) java가 python보다 훨씬 빠른데!

이유1) JAVA 유료화.

아주 현실적인 이유를 봐버렸고 납득해버렸다. Oracle의 SunMirco System 인수와 그에따른 JAVA 유료화 정책 때문이었다. 이 탓에 기업들이 java8에서 버전 업그레이드를 주저하게 되고, 아에 java 이탈을 고려하게 된 것이다.

근데 이건 데이터 처리 분야랑을 좀 관계가 없는 것 같그든요.

 

이유2) 동적 타이핑

자바는 정적이다.(앞뒤 다 잘라먹고 이야기했다가 교수님한테 등짝 맞기 딱 좋은 말인걸 ^^ 뭐든지 상대적이긴 하지만 자바가 정적이라는 소리를 하다니 어머어머.)

 

자바는 빼빼로 데이용 빼빼로 번들이고, 파이썬은 종합과자 선물이다.

한 배열에 하나의 데이터 타입만 넣을 수 있는 자바와 달리 파이썬은 정수를 넣었다 문자를 넣었다 마음대로 할 수 있다.

이건 데이터 처리에서 아주 강력하고 편리한 차이가 될 수 밖에 없다.

[출발지:창원]에서 [도착지:구미]로 가는 [버스번호:1557]번 버스를 탄 [나이:53]세 [여성]이 [좌석: 창가]에 앉았고 [안전벨트착용: True]인 상태에서 [생존: True]인 경우를 하나의 리스트에 다 넣어버릴 수 있는게 파이썬이다.

 

자, 그럼 이건 자바는 못하는가? 해당 속성을 가진 클래스를 만들고, 그 인스턴스를 담는 배열을 만들면 되는거 아닌가?

...하...그러게...왜지...

 

이유3) 화려한 수학 및 통계 라이브러리와 데이터 시각화 패키지+Tensorflow

나는 통계수업에서 SPSS를 썼지만 당시에도 R이 치고 올라와 양대산맥을 이루고 있었고, python은 그런 R을 패키지화 해서 제공한다. 통계분야에서 둘은 사실상 한몸이 된 것 같다. 그 외에도 Numpy, Pandas 같은 데이터 처리 패키지는 물론이고 matplotlib, plotly 같은 시각화 패키지가 잘 구성되어있다. 특히 plotly은 디자인적으로도 예뻐서 개인적으로 좋아한다.

게다가 아에 대놓고 AI전용 패키지를 제공해준다. 이것만 있으면 깊이나 가중치 정도만 고려하면 실제 모델 생성을 알아서 해주니 AI입문자들은 파이썬으로 갈 수 밖에 없다.

 

 

그럼에도 불구하고

위에서 뽑은 이유 중 자바 유료화와 동적 타이핑 문제는 그렇다 쳐도, 수학통계 패키지에 대해서는 의문이다. 자바는 이런 패키지가 없는건가?? 긴 시간동안 점유율 1위였고, 기업들은 기본적으로 java를 썼는데? 웹하면 당연히 java였잖아. openCV같은 강력한 패키지들도 다들 for python이 나오는 마당에 왜 자바는 저런 패키지들을 확보하지 못했던거지?? 음, 아직 더 알아볼게 많은 것 같다. 

 

참고링크

알아온게 아니고 이제부터 알아봐야하고 우선은 찾아둔 링크들을 넣어둔다.

이렇게 해놔야 안잊겠지.

-http://jakevdp.github.io/blog/2014/05/09/why-python-is-slow/

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

-https://king-veloper.tistory.com/6

https://www.itworld.co.kr/news/109189