Я думаю, вы можете очистить код с помощью:
npz_file_dict = np.load(npz_file_path)
A = npz_file_dict['A'] # (33000,) shape array
B = npz_file_dict['B']
C = npz_file_dict['C']
for a,b,c in zip(A,B,C):
# do some work with (a,b,c)
# store the result in a json format with {'a' : a, 'b' : b, 'c' : c}
Это дает понять, что вы работаете с массивами, которые вы загрузили из файла. Я не знаю, ускорит ли это вещи или нет; это зависит от того, использует ли загрузчик npz
какой-либо кэш с повторным доступом npz_file_dict['A]
или нет.
Но независимо от того, как они создаются или загружаются, итерация по пустым массивам происходит медленно - гораздо медленнее, чем если бы вы использовали над ними скомпилированные операции «целый массив». Итерации по спискам быстрее. На самом деле это может помочь сделать
for a,b,c in zip(A.tolist(), B.tolist(), list(C):
...
A.tolist()
- быстрый способ превратить массив в список. Я не использую его на C
, потому что это 3d, и я предполагаю, что вы хотите использовать C[i,:,:]
как массив, а не как список гнезд. Хотя, поскольку вы пишете c
в json
, вы все равно можете захотеть, чтобы он был списком списков.
===
Итерация по массиву memmap
немного медленнее, чем итерация по массиву в памяти:
In [1]: C=np.ones((3000,224,224))
In [2]: np.savez('bigC.npz',C=C)
In [3]: fp = np.memmap('bigC.dat', dtype=C.dtype, mode='w+', shape=C.shape)
In [4]: fp[:] = C[:]
In [5]: %%timeit
...: for i in range(3000):
...: c = C[i]
...:
566 µs ± 2.55 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [7]: %%timeit
...: for i in range(3000):
...: c = fp[i]
...:
...:
9.74 ms ± 94.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Итерация по npz
нагрузке действительно медленная - мой тест все еще выполняется:
In [8]: %%timeit d = np.load('bigC.npz')
...: for i in range(3000):
...: c = d['C'][i]
Тест с одной начальной нагрузкой:
In [243]: d = np.load('bigC.npz')
In [244]: %%timeit
...: D = d['C']
...: for i in range(3000):
...: c = D[i]
...:
2.17 s ± 27.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [245]: %%timeit
...: D = d['C']
...:
...:
2.14 s ± 6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Так что одноразовой загрузки большого массива из npz
можно избежать, но вы, конечно, не хотите многократно загружать его для каждой строки. Выгрузка его в memmap может помочь, если массив настолько велик, что не помещается в память, это не улучшение по сравнению с массивом в памяти.