숫자(실수)를 정말 많이 저장할 때는 리스트보다 오히려 배열이 더 유리하다.
배열은 시퀀스(https://shechren.github.io/lunetzsche/posts/Sequence/를 참조하라)의 한 종류로서 가변형이며, 파일을 읽어오거나 저장하는 메소드 또한 지원한다.
이제 우리는 무작위 배열 하나를 만들어보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
from array import array
from random import random
f = array("d", (random() for \_ in range(10\*\*5)))
# 10의 5제곱에 해당하는 랜덤 배열을 생성한다.
g = f[-1]
# 배열 f의 마지막 수를 출력한다.
print(g)
이제 우리는 10의 5제곱 내에서 랜덤으로 생성된 임의의 수 하나를 얻을 수 있게 된다.
중요한 것은 array 다음에 오는 것은 바로 타입코드라는 것이다. 저기에 임의의 char를 입력해보면 무엇이 문제인지 에러가 뜨니 쉽게 알 수 있다. 우리는 배밀도 실수의 타입코드 d를 이용해서 배열을 생성했다. 리스트 컴프리헨션에서 본 제너레이터 표현식을 사용했으며, 당연히 언더바 대신 i가 들어가든 a가 들어가든 아무 상관 없다.
자 이제 이것을 이진 파일로 저장하고, 읽어와보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ff = open("ff.bin", "wb")
# ff.bin을 연다. 없다면 생성한다.
f.tofile(ff)
# 파일을 저장한다.
ff.close()
f2 = array("d")
ff = open("ff.bin", "rb")
#ff.bin을 연다.
f2.fromfile(ff, 10\*\*5)
#10의 5제곱에 해당하는 데이터를 추출한다.
ff.close()
gg = f2[-1]
# gg는 f2의 마지막 숫자, 즉 배열 내의 랜덤한 수 하나다.
print(gg)
여기서도 역시나 메소드가 나오게 된다. 전부 적지는 않을 것이며 더 깊게 알고 싶다면 전문가를 위한 파이썬 책을 보자.
메소드 | 설명 | 리스트 | 배열 |
---|---|---|---|
a.__add__(b) | a와 b 리스트를 연결한다. a + b | 가능 | 가능 |
a.__iadd__(b) | a와 b 리스트를 연결하고 a에 저장한다. a += b | 가능 | 가능 |
a.append(e) | 제일 뒤에 요소를 하나 추가한다. | 가능 | 가능 |
a.clear() | 모든 항목을 삭제한다. | 가능 | 불가능 |
a.__contains__(e) | e in s | 가능 | 가능 |
a.count(e) | e가 발생한 횟수를 계산한다. | 가능 | 불가능 |
a.__delitem__(p) | p 위치의 요소를 삭제한다. | 가능 | 가능 |
a.fromfile(f, n) | 이진 파일 f에서 n개의 항목을 가져와서 추가한다. | 불가능 | 가능 |
a.fromlist(l) | 리스트 l의 요소를 추가한다. 만약 TypeError가 단 한 번이라도 발생한다면 아무것도 추가하지 않는다. | 불가능 | 가능 |
a.__getitem__(p) | p 위치의 항목을 가져온다. a[p] | 가능 | 가능 |
a.insert(p, e) | p 위치에 있는 항목 앞에 e 요소를 추가한다. | 가능 | 가능 |
a.__len__() | 항목 수를 반환한다. len(a) | 가능 | 가능 |
a.pop([p]) | p 위치 혹은 제일 마지막 항목을 제거하고 반환한다. | 가능 | 가능 |
a.remove(e) | 값이 e와 일치하는 항목을 제거한다. | 가능 | 가능 |
a.tofile(f) | 이진 파일 f에 항목을 저장한다. | 불가능 | 가능 |
a.tolist() | 항목을 수치형 객체로 변환해서 넣은 리스트를 반환한다. | 불가능 | 가능 |