PYCON KOREA 2019

Pythonista, Python잘알* 되자


* Python잘알: Python 아는 사람의 줄임말

 

 코딩이 초등학교 과정에도 포함되는 대세가 되면서 매일 코딩을 하는 개발자가 아니라도 코딩을 공부하는 사람들이 증가하고 있다.  파이썬은 쉬운 문법으로 읽기 쉬운 특징을 강조하는 언어로, 코딩 입문자들에게 추천되는 언어이다. 또한 일반적인 목적으로 사용되는 언어이기 때문에 풍부한 라이브러리가 제공되어 다양한 유저들이 사용할 있다최근에는 구글이 개발한 TensorFlow 다양한 딥러닝 라이브러리가 파이썬으로 제공되면서 더더욱 파이썬 유저들 , 파이써니스타들이 증가하는 추세이다.

 

언어별 질문 뷰수 추세 전망 (출처: StackOverflow)

 

이러한 추세에 힘입어 파이썬의 저변 확대와 커뮤니티 활성화를 표방하는 PyCon 역시 매진을 거듭하였다.




지속된 매진사태 (출처: PyCon Korea Facebook 공식 페이지)

 

 이번 파이콘에서는 파이써니스타들이 파이썬잘알이 있도록 파이썬의 내부 메커니즘을 이해하고, 보다 빠르고 효율적으로 사용할 있는 Tip 공유하는 세션들이 많았다. 내장형 변수, Pandas, 코드 리뷰 등의 가지 주제에 대한 세션을 소개하고자 한다.

 


내장형 변수 이해하기

 

 파이썬이 배우기 쉽고 간단한 신택스를 가지고 있는 이유 하나는 파이썬이 동적 타입(dynamic typing) 지원하기 때문이다. 동적 타입을 지원한다는 것은 코딩할 변수 안에 넣을 데이터가 어떤 타입인지 정해주지 않아도 된다는 의미이고, 그렇기 때문에 코드의 길이가 훨씬 짧아진다코딩을 완료한 프로그램을 실행하게 되면, 연산을 시행하면서 해당 변수의 타입을 판단하게 된다아래 이미지와 같이 "오리처럼 걷고, 오리처럼 꽥꽥 소리를 내니 오리인 틀림없어!"라고 판단 과정을 거친다고 하여 타이핑(duck typing)이라고도 한다.


위와 같은 상황은 duck fooding이라고도 있겠다.. (출처: geekandpoke)


 그렇기 때문에 Python에서는 Java C에서보다 유연하게 적용될 있게 된다. 예를 들어, 파이썬에서 리스트를 사용하면 사용할 메모리 공간에 국한되지 않고 추가/삭제를 있는 식이다. 하지만 실제 동작하는 방식도 우리의 생각처럼 간단할까? 시간 복잡도로 살펴보는 파이썬 내장 자료형의 효율적인 활용 세션은 실제 파이썬이 빌드된 C 스크립트를 함께 살펴보며 내장 자료형에 대한 이해를 도모하였고, 그중 mutable datatype list 작동방식을 시간복잡도를 통해 것이 가장 인상적이었다.

 먼저, 파이썬의 가장 대표적인 배열 데이터타입인 list에는 새로운 원소를 더하는 append 라는 함수를 사용한다.



위의 append 연산을 수행할 일견 O(1) 시간복잡도를 가지는 간단한 연산이라고 생각할 있다. 그러나 실제 리스트에서는 0, 4, 8, 16, 25, 35, 46 크기로 리스트에서는 메모리를 확보해둔 , 할당된 사이즈가 때마다 resize  통해 새로 공간을 확보하도록 한다. 이를 통해, 시간에서 이득이 생기도록 하는 것이다. 따라서 평균적으로는 O(1) 가깝지만 O(n) 발생하기도 하는 것을 있다.


                           ▲ 사이즈가 커지니 resize  발생 여부에 따라 속도가 1000 이상 차이

 

 그렇기 때문에 작은 용량의 data에서는 차이가 없지만, 스케일업을 염두해두고 있다면 이는 커다란 속도 차이로 이어지게 것이다. 미리 리스트에 공간을 할당한 , 인덱스를 통해 값을 배정하면 이와 같은 상황을 방지할 있다.

 


유사하게 list pop  같은 함수 역시 매번 값을 꺼낼 때마다 해당 인덱스 이후의 값들을 모조리 앞으로 당겨야 하기 때문에 매번 O(n) 시간복잡도로 수행된다고 한다. 앞으로 스크립트의 시간복잡도를 계산할 , 파이썬이 interpretive 언어라는 것을 인지하고 보이지 않는 곳에서의 메커니즘까지 고려할 있는 자세가 필요하겠다.

 

추가 참고세션: 파이썬의 변수 (강한 타입, Immutable vs Mutable, Class vs Instance)


Pandas 가볍고 빠르게

 

 Pandas 관계형 데이터를 빠르고 유연하게 처리하기 위해 개발된 자료구조로 데이터 처리와 분석에 많이 활용되고 있다. 그러나 막상 사용하면 생각보다 연산 속도가 빠르지 않다거나, 메모리 에러가 나는 등의 불편함을 느낄 때가 있을 것이다뚱뚱하고 굼뜬 판다스(Pandas) 위한 효과적인 다이어트 전략 세션에서는 공공데이터를 예시로 사용하여 보다 가볍고 빠르게, 그리고 결론적으로 효율적으로 사용할 있도록 하는 팁을 들을 있었다.

 

가지 전략을 통해 Pandas 다이어트해보자

 

 첫째로, 읽어오는 데이터의 용량을 줄이는 방법이 있다.

 먼저, 데이터 형식을 변환한다. 형식을 지정하지 않고 데이터를 불러오면 가장 메모리를 많이 차지하는 방식으로 데이터를 불러오기 때문에 방법으로 메모리를 줄이게 되면 데이터도 불러올 있다고 한다. 특히 check_dtypes() 함수를 이용하면 컬럼 최소, 최대 범위를 계산해 적절한 데이터 형식을 가져올 있다.



 또한, 불연속 변수이고 범주가 한정적인 경우 Category 데이터형식을 사용하면 데이터 처리 분석 속도와 시각화에서의 편의성을 높일 있다

 

 

 상당한 속도 향상을 있다

 

 파일을 저장할 때에도 CSV보다는 parquet, hdf5 등의 형식을 사용하면 저장하는 시간과 메모리를 아낄 있다


파일 형식에 따른 IO 메모리 사용량 파일 크기

 

 둘째, 처리 방식을 개선하는 것이다.

 Pandas apply 함수를 통해 사용자들이 자신만의 custom 함수를 만들어 사용하기도 한다. 그러나 어떤 방법을 사용하는지에 따라 데이터의 처리 속도는 천차만별이기 때문에 325개의 Series 함수, 224개의 DataFrame 함수에 있는 좋은 처리 방식이 있다면 이를 사용하는 것이 훨씬 현명한 방법이다

 

▲ 같은 연산을 하더라도 어떤 방법을 사용하느냐에 따라 속도에 105배까지 차이가 생긴다

 

 또한 반복문을 사용하지 않고 벡터화하여 Numpy Array로서 연산하게 되면 가장 빠르게 처리할 있다고 한다.


반복문보다는 벡터화하여 사용하자

 

 셋째, 코딩 컨벤션에 따라 코드하는 것이다.

 파이썬에도 PEP8이라는 컨벤션에 따라 코딩하는 것을 권장한다. Pandas 역시 Method Chaining이라는 방식을 통해 가독성을 높이도록 권장하고 있다. 결과 DataFrame 전체를 생성하고 재할당하는 특징이 있기 때문에 drop() 이나 astype()  같은 함수를 우선적으로 사용하여 데이터 크기가 줄어들면 메모리를 효율적으로 사용할 있다.


▲ Method Chaining

 

 Pandas DataFrame 함수들은 inplace 파라미터를 가지고 있는 경우가 많은데, 작업 결과를 바로 해당 DataFrame 덮어씌울 많이 사용하게 된다. 그러나 inplace  실행 후에도 메모리에 데이터가 남아있는 등의 문제가 있어 Pandas Core 개발자들은 inplace 사용을 반대하며 deprecation 논의를 진행중이라고 하니 Method Chaining 방식으로 코딩을 하는 것이 좋겠다.

각종 툴과 린터를 통한 Code Quality 향상

 

 위에서도 적었지만, 파이썬은 읽기 쉬움(readability) 지향하기 때문에 PEP8이라는 coding convention 사용한다. PEP8 따라 코딩하게 되면, 협업할 경우 다른 사람이 코드리뷰를 하기 쉬워지고, 버그가 보여 디버깅에도 도움이 된다. 이를 위해 코딩이 완료되면 코드의 보푸라기(lint) 제거하고 코드 퀄리티를 높이기 위해 코드 리뷰 툴을 사용하게 된다.

 Code review tips for Pythonistas 세션에서 스피커는 autopep8, Black, YAPF 등의 자동 포맷 툴을 사용하여 간단한 오류는 자동적으로 감지하게끔 하자고 제안한다. 최근 인기있는 Black PyCon 2019에서 툴을 소개하는 세션 갖기도 하였으니 참고해보면 좋을 같다.

 정적 타입 검사로 나은 Python 코드 작성하기 세션에서는 hinting 이라는 모듈을 도입하여 실행하기 전에 오류를 미리 탐지하고, 코드 리딩이 쉬워지도록 하자고 제안한다. 이렇게 타입 힌팅을 해두면 mypy 통해 커밋하기 버그를 빨리 잡아낼 있다고 한다.

(공백)

 

 

 


 

 

 

 파이썬을 주언어로 사용하고는 있지만, 파이썬이 다른 언어와 다른 점이 무엇인지, 그리고 실제로 어떻게 돌아가는지에 대한 지식은 부족한 경우가 많은 같다. 매우 느린 언어라고 알려져있고, 그렇기 때문에 서빙보다는 리서치 위주로 사용되는 경향이 많다고는 하지만 사용하는 도구를 알아가는 과정이 자유롭게 도구를 사용할 있도록 이끌어줄 것이다.

  기사가 사내 파이써니스타에게 새로운 인사이트를 가져다줄 있기를 기대한다.


유고은기자

Posted by SK브로드밴드

댓글을 달아 주세요