Array


In [2]:
from array import array
from random import random

In [20]:
floats = array('d', (random() for i in range(10**7)))

In [7]:
floats[-1]


Out[7]:
0.8773245922299983
  1. 천만 개의 숫자를 텍스트 파일로 저장하는데는 수 초에서 수십 초가 소요된다. (약 20초)
  2. 결과 파일의 크기는 약 180MB

In [37]:
%%timeit
with open('floats-10m.txt', 'w') as f:
    for fp in floats:
        f.write(str(fp))
        f.write('\n')


1 loops, best of 3: 21.2 s per loop
  1. array.tofile은 천만 개의 숫자를 저장하는데 약 50ms가 소요된다. 일반 텍스트 파일에 저장하는 방식보다 수십에서 수천 배 빠르다.
  2. 천만 개의 부동소수점을 저장한 파일크기는 약 80MB

In [19]:
%%timeit
with open('floats', 'wb') as fp:
    floats.tofile(fp)


10 loops, best of 3: 46.1 ms per loop

천만 개의 같은 숫자를 담은 텍스트 파일을 읽어들이는데 수 초 (2.7초) 소요


In [26]:
%%timeit
with open('floats.txt', 'r') as f:
    f.readlines()


1 loops, best of 3: 2.67 s per loop

array.fromfile은 텍스트 파일에서 읽어오는 것보다 수십 배 (30-60배) 빠르다.


In [18]:
%%timeit
floats2=array('d')
with open('floats', 'rb') as fp:
    floats2.fromfile(fp, 10**7)


10 loops, best of 3: 77.2 ms per loop

MemoryView

자료구조들 사이 자료 복사 없이 메모리를 공유할 수 있게 해준다. 대용량 자료 처리에 필수적인 요소.


In [29]:
numbers = array('h',[-2,-1,0,1,2])
numbers


Out[29]:
array('h', [-2, -1, 0, 1, 2])

In [30]:
memv = memoryview(numbers)

In [31]:
len(memv)


Out[31]:
5

In [32]:
memv[0]


Out[32]:
-2

In [34]:
memv_oct = memv.cast('B')
memv_oct


Out[34]:
<memory at 0x0000000000E6B368>

In [35]:
memv_oct.tolist()


Out[35]:
[254, 255, 255, 255, 0, 0, 1, 0, 2, 0]

바이트 오프셋 5에 4 할당


In [36]:
memv_oct[5]=4
numbers


Out[36]:
array('h', [-2, -1, 1024, 1, 2])

NumPy와 Scipy


In [38]:
import numpy as np

In [39]:
%timeit floats = np.loadtxt('floats-10m.txt')


1 loops, best of 3: 38.3 s per loop

Numpy 바이너리 형식으로 천만 개의 부동소수점 저장


In [40]:
%timeit np.save('floats-10m.npy', floats)


1 loops, best of 3: 374 ms per loop

In [41]:
%timeit floats2 = np.load('floats-10m.npy', 'r+')


The slowest run took 27.06 times longer than the fastest. This could mean that an intermediate result is being cached 
1000 loops, best of 3: 1.13 ms per loop

pandas


In [ ]:

deque


In [ ]: