-
Решил глубже познакомиться с NumPy. Сложилось впечатление, что операции над отдельными элементами даже медленнее, чем для стандартных структур Питона. Поэтому надо избегать перебирания элементов в цикле и сводить всё к операциям, обрабатывающим сразу весь массив. Это так?
-
Проводил ли кто-либо сравнения скоростей извлечения бинарных данных средствами numpy и struct? Например, средствами numpy
x = data[p:p+4].view('>u4')[0]
у меня получилось почти вдвое медленнее чемx = struct.unpack('>I', data[p:p+4])[0]
, но килобайтные массивы numpy преобразует уже на несколько процентов быстрее. Не встречали ли вы подробный анализ? Есть ли что-либо быстрее np.ndarray.view()? -
Что лучше,
np.memmap(filename, dtype='u1', mode='r')
,np.fromfile(filename, dtype='u1')
илиnp.frombuffer(open(filename, 'rb').read(), dtype='u1')
? -
Можно ли средствами numpy организовать дельта-декодирование, быстрее такого?
previous = 0
for c, d in enumerate(data):
a = (d + previous) % 4294967296
previous = a
data[c] = a
Ответ: np.cumsum(data, ‘>u4’)
- То же по разным вариантам RLE-разжатия. Например:
src, dst = 0, 0
while src < len(data):
if data[src] == special:
length = data[src+1]
if length == 0: # копировать special
unpacked[dst] = special
dst += 1
src += 2
else: # length раз повторить C
c = data[src+2]
unpacked[dst:dst+length] = c
dst += length
src += 3
else: # копировать следующий байт
unpacked[dst] = data[src]
dst += 1
src += 1
- zlib и deflate. Есть ли что-либо помимо
unpacked = np.frombuffer(zlib.decompress(packed.tobytes()), 'u1')
?