Python

Pythonic way

아래 내용들은 『파이썬 코딩의 기술 2015, 2016』에 나오는 내용들이다.

  • map과 filter 대신 list comprehension을 사용하라
  • range 보다는 enumerate를 사용하라
  • def 에서 *args를 사용하면 함수에서 가변 개수 variable argument의 위치 인수를 받을 수 있다.
  • class에 필요한 다른 생성자를 정의하려면 @classmethod를 이용하라
  • super로 부모 함수를 초기화 하라
  • 파이썬의 언어 후크language hook를 사용하면 시스템을 연계하는 범용 코드를 쉽게 만들 수 있다.
    • __getattr__, __getattribute__, __setattr__
  • __doc__이라는 속성에 접근하면 파이썬 프로그램 자체에 포함된 docstring을 추출할 수 있다.
  • 최적화 하기 전에 Profile을 이용해 프로파일 하라

(Effective Python, 2015)

추가:

28: 커스텀 컨테이너 타입은 collections.abc의 클래스를 상속받게 만들자

42: functools.wraps로 함수 데코레이터를 정의하자

자료형
리스트의 시작 부분에서 아이템을 삽입하거나 삭제하는 연산에는 선형적 시간 linear time이 걸리므로 deque의 일정한 시간보다 훨씬 느리다.

이진 검색은 bisect_left 같은 효율적인 함수 이용
i = bisect_left(x, 991234)

itertools는 이터레이터를 구성하거나 이터레이터와 상호 작용하는데 유용한 함수를 제공한다.
product: 이터레이터에 있는 아이템들의 카테시안 곱을 반환한다.
permutations, combinations 포함

set, list, tuple

a = {1, 2, 3}  # set
b = [1, 2, 3]  # list
c = (1, 2, 3)  # tuple

List is mutable and tuples is immutable.

List Comprehension

Nested Loops

flattened = []
for row in matrix:
    for n in row:
        flattened.append(n)

Here’s a list comprehension that does the same thing:

flattened = [n for row in matrix for n in row]

Other Comprehensions

flipped = {}
for key, value in original.items():
    flipped[value] = key

That same code written as a dictionary comprehension:

flipped = {value: key for key, value in original.items()}

Python dictionary is hash mapping or hash table.
참고

코딩 가이드

Extending with C++

고성능 파이썬 2013, 2016

컴퓨터 시스템의 기본:
암달의 법칙 Amdahl’s law: 멀티 코어에서 작동하도록 설계된 프로그램 일지라도 하나의 코어에서 실행되어야 하는 루틴이 존재하고, 더 많은 코어를 투입해도 병목으로 작용한다는 법칙.

예를 들어, 1분이 소요되는 설문 조사를 100명을 대상으로 했을때, 조사원이 2명이라면 50분에 끝낼 수 있겠지만 조사원이 200명이라도 1분 이내로 끝낼 수는 없다. 여기서 1분의 루틴이 존재한다. p.24

파이썬의 성능:

  1. 파이썬 객체가 메모리에 최적화된 상태로 저장되지 않는다. 메모리를 자동으로 할당/해제하는 GC를 사용하는데, 이는 CPU 캐시에 데이터를 전송하는데 영향을 미치는 메모리 단편화를 일으킨다.
  2. 동적 타입을 사용하며, 컴파일 되지 않는다. 이 문제를 극복하는 방법 중에는 Cython이 대표적이다.
  3. GIL: CPU의 병렬 연산이 불가능하다. 이 문제는 멀티쓰레드가 아닌 멀티프로세스(mulprocessing 모듈 사용)를 사용해서 회피할 수 있다.

p.33

파이썬을 쓰는 이유:
표현력이 좋고 배우기 쉽다. 파이썬 라이브러리는 타 언어로 작성된 도구를 감싸서 다른 시스템도 쉽게 호출할 수 있도록 하고 있다. 예를 들어 scikit-learn은 C로 작성된 liblinear, libsvm 사용. NumPy는 BLAS와 또 다른 C, Fortran 라이브러리 포함.

프로파일링:
데코레이터(자바의 어노테이션)를 활용한 시간 측정. line_profiler가 좋아 보이지만 최근 버전에서 잘 동작하지 않는듯 하다. (확인 필요)

더 효율적인 탐색:
팀 정렬은 다양한 정렬 알고리즘을 활용하여 주어진 데이터에 어떤 알고리즘을 적용하는 것이 최선인지를 추측하는 휴리스틱을 사용한다(더 자세히 말하자면, 삽입 정렬과 병합 정렬 알고리즘을 조합해서 사용한다)
p.90

리스트의 경우 꽉 찼을때 리사이징을 한다고 언급한다. 로드 팩터를 기준으로 하는 방식은 해시 테이블만 그런지 확인 필요.

해시 테이블에서 데이터가 얼마나 균등하게 분포되어 있는지를 로드 팩터라 하며, 해시 함수의 엔트로피와 관련 있다. p.106 최소 충돌일때 당연히 엔트로피는 최대가 된다.

Dict의 최소 크기는 8이다. 이 크기는 50,000까지는 4배씩 증가하고 그 뒤로는 2배씩 증가한다.

8, 32, 128, 512, 2048, 8192, 32768, 131072, 262144, ...

많은 항목이 삭제되면 크기가 줄어들 수도 있다. 해시 테이블은 로드 팩터에 따라 크기를 조절하는게 맞는지 확인 필요.

파이썬의 range()는 값을 리턴하는게 아니라 제네레이터를 리턴한다. p.120 그래서 메모리를 절약할 수 있다.

JIT vs. AOT:
미리 컴파일 하는 방식 ahead of time으로 Cython, 적절한 때에 컴파일 하는 방식 just in time으로 Numba, PyPy가 있따. GCC, Clang등은 당연히 AOT 방식.

이 책은 multiprocessing 모듈에 대해 많은 부분을 할애하고 있다.

바이트와 유니코드:
파이썬 2.7은 모든 유니코드가 같은 수의 바이트를 사용한다. PEP 393 덕분에 파이썬 3.3 이상은 유연한 유니코드 표현을 사용한다. 파이썬 3.3에서는 문자열에 속한 문자들의 범위를 관찰해서 가능하다면 낮은 수준의 문자(ASCII등)는 더 적은 바이트를 사용하도록 한다. p.361

뇌를 자극하는 파이썬 3 2016

가변 매개 변수 arbitrary argument list

def merge_string(*text_list):
    result = ''
    for s in text_list:
        result += s
    return result
merge_string('A','B','C')

*는 포인터가 아님. 튜플로 정의된다. 타입 확인 가능.

함수 안의 함수: 중첩 함수 nested function
자신이 소속된 함수의 매개변수에 접근이 가능하다.


2017 Book Reports · 2018 Book Reports · 2019 Book Reports · AWS · Activation, Cost Functions · Android Development · CNN, RNN · C++ · Decision Tree · Docker · Go · HTML, CSS, JavaScript · Hadoop, Spark · Information Retrieval · Java · Jupyter Notebooks · Keras · LeetCode · LifeHacks · MySQL · NLP 가이드 · NLP 실험 · NLP · Naive Bayes · OAuth 2.0 · OOP · Project Management · Python Data Structure Cheatsheet · Python · RSA · Software Deployment · Support Vector Machine · TensorRT · Word Embedding · XGBoost · Scikit Learn · 거리 · 데이터 마이닝 · 데이터 사이언스 · 딥러닝 · 머신러닝 분류기 · 머신러닝 · 미래학 · 비지니스 · 사회심리학 · 수학 · 알고리즘 · 영어 · 운영체제 · 이산수학 · 인공지능 · 자료구조 · 진화생물학 · 컴파일러 · 컴퓨터시스템구조 · 통계학 응용 · 통계학 ·
is a collection of Papers I have written.
© 2000 - Sang-Kil Park Except where otherwise noted, content on this site is licensed under a CC BY-NC 4.0.
This site design was brought from Distill.