Почему вложенный словарь замедляет numpy save? - PullRequest
0 голосов
/ 08 мая 2018

Предположим, у нас есть следующий код

import numpy as np

D = []
for _ in range(200):
   d = []
   for _ in range(300):
      d.append({'a': np.random.randn(64, 64, 3), 'b': np.random.randn(64, 64, 3)})
   D.append(d)

np.save('data', D)

Сохранение этих данных занимает очень много времени.Что-то не так с кодом, или это из-за объекта словаря?

----------------------- Update----------------------------

Вынося словарь наружу, хотя и с тем же размером данных,значительно быстрее.Так что, похоже, словарь замедляет процесс.Есть ли какая-то потенциальная причина для этого?

т.е.

import numpy as np

D1 = []
D2 = []
for _ in range(200):
   d1 = []
   d2 = []
   for _ in range(300):
      d1.append(np.random.randn(64, 64, 3))
      d2.append(np.random.randn(64, 64, 3))
   D1.append(d1)
   D2.append(d2)

np.save('d1', D1)
np.save('d2', D2)

1 Ответ

0 голосов
/ 08 мая 2018

Вот код, который делает нечто похожее, но эффективно, векторизованно, без медленных циклов for:

np.savez('data',
    a=np.random.randn(200, 300, 64, 64, 3),
    b=np.random.randn(200, 300, 64, 64, 3))

Формат вывода немного отличается - он более компактен и будет более эффективным для чтения.

Обратите внимание, что это почти 12 ГБ данных, поэтому, конечно, потребуется время, чтобы сгенерировать случайные числа и записать их на диск. Если ваши реальные данные имеют меньшую энтропию, чем случайные числа, вы можете рассмотреть возможность использования savez_compressed() для включения сжатия и экономии дискового пространства (за счет времени процессора при сохранении и загрузке).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...