низко висящий фрукт
numpy.savez_compressed('AlaskaCoast.npz', arr)
arr = numpy.load('AlaskaCoast.npz')['arr_0']
Загрузка в 2,3 раза быстрее, чем ваш код на основе PIL.
Используется zipfile.ZIP_DEFLATED
, см. savez_compressed document.
Ваш код PIL также содержит ненужную копию: array(img)
должно быть asarray(img)
. Это стоит всего 5% времени медленной загрузки. Но после оптимизации это будет важно, и вы должны иметь в виду, какие операторы будут создавать копии.
Быстрая декомпрессия
Согласно тестам zstd , при оптимизации для декомпрессии lz4 - хороший выбор. Простое подключение этого к рассолу дает еще 2,4-кратное усиление и на 30% медленнее, чем несжатый рассол.
import pickle
import lz4.frame
# with lz4.frame.open('AlaskaCoast.lz4', 'wb') as f:
# pickle.dump(arr, f)
with lz4.frame.open('AlaskaCoast.lz4', 'rb') as f:
arr = pickle.load(f)
Тесты
method size load time
------ ---- ---------
original (PNG+PIL) 5.1M 7.1
np.load (compressed) 6.7M 3.1
pickle + lz4 7.1M 1.3
pickle (uncompressed) 601M 1.0 (baseline)
Время загрузки измерялось внутри Python (3.7.3) с использованием минимального времени настенных часов более 20 запусков на моем рабочем столе. Согласно случайным взглядам на top
он всегда работал на одном ядре.
Для любопытных: профилирование
Я не уверен, имеет ли значение версия Python, большая часть работы должна выполняться внутри библиотек Си. Чтобы проверить это, я профилировал pickle + lz4
вариант:
perf record ./test.py && perf report -s dso
Overhead Shared Object
60.16% [kernel.kallsyms] # mostly page_fault and alloc_pages_vma
27.53% libc-2.28.so # mainly memmove
9.75% liblz4.so.1.8.3 # only LZ4_decompress_*
2.33% python3.7
...
Большую часть времени проводит внутри ядра Linux, занимаясь page_fault
и другими делами, связанными с (пере) распределением памяти, возможно, включая дисковый ввод-вывод. Большое количество memmove
выглядит подозрительно. Вероятно, Python перераспределяет (изменяет размер) окончательный массив каждый раз, когда приходит новый распакованный кусок. Если кто-то любит поближе взглянуть: Python и Perf профили .