Computer Engineering/Fluent Python 정리

Fluent Python Chapter 2-2. Sequence (bisect, deque, memoryview)

jordan.bae 2021. 12. 26. 23:00

지난 글 Chatper2-1 정리
https://myjorney.tistory.com/140

지난 글에 이어 이번 글에서는 Chapter2의 나머지 부분을 정리해보겠습니다.

아직 Chatper2의 앞 부분을 읽으시지 않았다면 이전 정리 글을 읽으시면 좀 더 편하게 읽으실 수 있을 것 같습니다.

 

내용 별 정리

list.sort()와 sorted()내장 함수

- list.sort()는 리스트 내부를 변경해서 정렬.

- sorted(list) 새로운 리스트를 생성해서 반환.

list.sort()메서드와 sorted()메서드의 차이를 설명하는 부분에서 파이썬의 함수를 작성할 때 중요한 관례 중 하나인 함수가 새로운 객체를 생성하지 않음을 알려주기 위해서 None을 반환하는 것을 설명해주는데 가끔 깜빡할 수 있는 부분인 것 같다.

 

정렬된 시퀀스를 bisect로 관리하기

많은 사람들이 아는 것 처럶 bisect 모듈은 정렬된 시퀀스에서 빠르게 element를 search 할 수 있다. 이 사실을 아는 사람은 많지만 실제로 코드에 잘 활용하는 것은 본 적이 많지 않다. 대부분 데이터의 양이 많지 않거나 라이브러리를 사용하면 반환하는 객체의 형이 정해져 있기 때문인 것 같은데 기억해두면 분명히 적절하게 사용할 기회가 있을 것 같다. 

 

FIFO(Queue)나 LIFO(Stack)의 자료구조가 필요할 땐 deque(double ended queue)

양방향 큐인 deque을 사용하면 queue 자료구조나 stack자료구조의 데이터를 효율적으로 다룰 수 있다.

 

리스트 안에 숫자만 있는 경우 -> array.array

같은 type의 데이터를 다루르는 경우 array.array로 효율적이고 빠르게 처리할 수 있다.

 

메모리 뷰(memoryview)

memoryview 내장 클래스는 공유 메모리 시퀀스형으로서 bytes를 복사하지 않고 배열의 슬라이스를 다룰 수 있게 해준다.

메모리 뷰는 PIL이미지, SQLite 데이터베이스, NumPy 배열 구조체를 복사하지 않고 메모리를 공유할 수 있게 해준다. 데이터셋이 커지는 경우 이것은 아주 중요한 기법이다.

 

아래 memoryview 코드 예제에서 구조체를 복사하지 않고 메모리를 공유해서 배열의 값을 변경한 것을 볼 수 있다.

import array

numbers = array.array('h', [-2,-1,0,1,2])
memv = memoryview(numbers)
len(memv)
5

memv[0]
-2

id(memv[0]), id(numbers[0])
(4546443376, 4546443376)

memv_oct = memv.cast('B')
memv_oct.tolist()
[254, 255, 255, 255, 0, 0, 1, 0, 2, 0]

memv_oct[5] = 4
numbers
array('h', [-2, -1, 1024, 1, 2])

 

 

 

파이썬의 표준 라이브러리에서 제공하는 시퀀스형만 해도 정말 종류가 많다. 각각의 시퀀스형들은 용도에 맞게 적절하게 사용하는 것만으로도 효율적이면서 파이썬스러운 코드를 작성할 수 있다. 한 번에 익숙해질 수는 없겠지만 계속 의식적으로 사용하고 공부하면 만든 사람들의 의도에 맞게 효율적으로 사용할 수 있을 것이다.

 

Chatpter2에서 정리했던 내용들을 간단히 살펴보면 아래와 같다.

- sequence의 구분 (container sequence vs flat sequence, mutable vs immutable)

- list comprehension으로 명확한 list 생성, generator를 이용해서 메모리를 효율적으로 사용하면서 iteration

- tuple (record, immutable)

- bisect 정렬된 시퀀스

- array.array 같은 데이터 type인 경우

- memoryview 메모리를 공유해서 사용하는

- deque 양방향 큐

 

 

Chatper2 정리는 이번 포스팅으로 마침니다. 
그럼 Chatper3 정리에서 봽겠습니다!



반응형