Remarks
이 글은 전문가를 위한 파이썬(Fluent Python)을 정리한 자료입니다.
2.4 슬라이싱
-
세 개의 마침표(
...
)로 표현된 생략기호:Ellipsis
객체x[i, ...] == x[i, :, :, :]
-
list의 list 만들기
Shallow copy: [['_'] * 3] * 3
2.7 list.sort()
와 sorted()
내장 함수
fruits = ['grape', 'apple', 'banana']
sorted(fruits, key=len, reverse=True)
2.8 정렬된 시퀀스를 bisect
로 관리하기
bisect.bisect()
: binary search 알고리즘을 이용해서 시퀀스를 검색bisect.insort()
: 정렬된 시퀀스 안에 항목을 삽입
import bisect
import random
SIZE = 7
my_list = []
for i in range(SIZE):
new_item = random.randrange(SIZE * 2)
bisect.insort(my_list, new_item)
print(f"{new_item:2d} -> {my_list}")
0 -> [0]
4 -> [0, 4]
0 -> [0, 0, 4]
5 -> [0, 0, 4, 5]
4 -> [0, 0, 4, 4, 5]
5 -> [0, 0, 4, 4, 5, 5]
2 -> [0, 0, 2, 4, 4, 5, 5]
print("bisect()")
for i in range(6):
print(f"pos({i}):", bisect.bisect(my_list, i))
bisect()
pos(0): 2
pos(1): 2
pos(2): 3
pos(3): 3
pos(4): 5
pos(5): 7
print("bisect_left()")
for i in range(6):
print(f"pos({i}):", bisect.bisect_leftmy_list, i))
bisect_left()
pos(0): 0
pos(1): 2
pos(2): 2
pos(3): 3
pos(4): 3
pos(5): 5
2.9 리스트가 답이 아닐 때
list
는 많은 수의 실수 데이터를 저장해야 할 때는 비효율적이다.
대신,np.ndarray
를 사용하거나array.array
를 사용하는 것이 훨씬 더 효율적이다.array
는 C언어의 배열과 마찬가지로 기계가 사용하는 형태로 표현된 바이트 값만 저장- Endian 변환에
array.byteswap()
을 사용할 수 있다.
array.byteswap()
: 배열 안의 모든 요소의 바이트 순서를 바꾼다. - 어떤 항목이 들어 있는지 검사하는 작업을 많이 수행하는 경우,
set
이 최적화되어 있다.
2.9.2 메모리 뷰
내장 class memoryview
공유 메모리 시퀀스형으로 bytes를 복사하지 않고 배열의 슬라이스를 다룰 수 있게 해준다.
memoryview.cast()
: 또 다른memoryview
객체를 반환하며 언제나 동일한 메모리를 공유
import array
numbers = array.array('h', [-2, -1, 0, 1, 2]) # int16
memv = memoryview(numbers)
memv_oct = memv.cast('B') # uchar
print("numbers:", numbers)
print("memv:", list(memv))
print("memv_oct:", list(memv_oct))
memv_oct[5] = 4
print("\nnumbers:", numbers)
print("memv:", list(memv))
print("memv_oct:", list(memv_oct))
numbers: array('h', [-2, -1, 0, 1, 2])
memv: [-2, -1, 0, 1, 2]
memv_oct: [254, 255, 255, 255, 0, 0, 1, 0, 2, 0]
numbers: array('h', [-2, -1, 1024, 1, 2])
memv: [-2, -1, 1024, 1, 2]
memv_oct: [254, 255, 255, 255, 0, 4, 1, 0, 2, 0]
PREVIOUSEtc