2.4 슬라이싱 ~ 2.9.2 메모리 뷰

 

Remarks

이 글은 전문가를 위한 파이썬(Fluent Python)을 정리한 자료입니다.


2.4 슬라이싱

  1. 세 개의 마침표(...)로 표현된 생략기호: Ellipsis 객체

    x[i, ...] == x[i, :, :, :]
    
  2. list의 list 만들기

    Shallow copy: [['_'] * 3] * 3
    

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

fruits = ['grape', 'apple', 'banana']
sorted(fruits, key=len, reverse=True)

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

  1. bisect.bisect(): binary search 알고리즘을 이용해서 시퀀스를 검색
  2. 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 리스트가 답이 아닐 때

  1. list는 많은 수의 실수 데이터를 저장해야 할 때는 비효율적이다.
    대신, np.ndarray를 사용하거나 array.array를 사용하는 것이 훨씬 더 효율적이다.
  2. array는 C언어의 배열과 마찬가지로 기계가 사용하는 형태로 표현된 바이트 값만 저장
  3. Endian 변환에 array.byteswap()을 사용할 수 있다.
    array.byteswap(): 배열 안의 모든 요소의 바이트 순서를 바꾼다.
  4. 어떤 항목이 들어 있는지 검사하는 작업을 많이 수행하는 경우, set이 최적화되어 있다.

2.9.2 메모리 뷰

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

  1. 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]