在速度,内存和查找方面,在Python中保存`.npz`文件而不是`.npy`有什么好处?

时间:2019-01-17 15:01:53

标签: python numpy save

保存numpy.savez文件的.npz的python文档是:

  

.npz文件格式是以文件中包含的变量命名的压缩文件存档。档案未压缩,档案中的每个文件都包含一个.npy格式的变量。 [...]

     

在加载时打开保存的.npz文件时,NpzFile对象为   回到。这是一个类似于字典的对象,可以查询   其数组列表(具有.files属性),以及该数组的列表   自己。

我的问题是:numpy.savez的意义是什么?

是保存多个数组的一种更简洁的版本(更短的命令),还是在保存/读取过程中有提速?它占用更少的内存吗?

2 个答案:

答案 0 :(得分:6)

回答问题有两个解释部分。

I。 NPY与NPZ

正如我们已经从文档中读取的那样,.npy格式为:

  

NumPy中的标准二进制文件格式,用于将 个任意NumPy数组保留在磁盘上。 ...该格式旨在在达到其有限目标的同时尽可能地简单。 (sources

.npz只是一个

  

多个 数组组合到一个文件中的简单方法,可以使用ZipFile包含多个“ .npy”文件。对于这些档案,我们建议使用文件扩展名“ .npz”。 (sources

因此,.npz只是一个包含多个“ .npy”文件的ZipFile。 可以对该ZipFile进行压缩(通过使用np.savez_compressed)或未压缩(通过使用np.savez

类似于类似Unix的系统中的tarball archive file,其中tarball文件可以只是一个未压缩的存档文件,其中包含其他文件,也可以是压缩文件,通过与各种压缩程序结合使用(gzip bzip2等)

II。用于二进制序列化的不同API

Numpy还提供different APIs来产生这些二进制文件输出:

  • np.save --->将数组保存为NumPy .npy格式的二进制文件
  • np.savez->以未压缩 .npz格式将多个数组保存到单个文件中
  • np.savez_compressed->将多个数组以压缩 .npz格式保存到单个文件中
  • np.load->从.npy.npz或腌制的文件中加载数组或腌制的对象

如果我们浏览Numpy的源代码under the hood,则有:

def _savez(file, args, kwds, compress, allow_pickle=True, pickle_kwargs=None):
    ...
    if compress:
        compression = zipfile.ZIP_DEFLATED
    else:
        compression = zipfile.ZIP_STORED
    ...


def savez(file, *args, **kwds):
    _savez(file, args, kwds, False)


def savez_compressed(file, *args, **kwds):
    _savez(file, args, kwds, True)

然后回到问题:

如果仅使用np.save,则在.npy格式之上没有更多的压缩,只有一个存档文件可以方便地管理多个相关文件。

如果使用np.savez_compressed,则磁盘上的内存当然会减少,因为执行压缩作业需要更多的CPU时间(即,速度稍慢)。

答案 1 :(得分:0)

主要优点是数组是延迟加载的。也就是说,如果您的npz文件包含100个数组,则可以加载该文件而无需实际加载任何数据。如果请求单个数组,则仅加载该数组的数据。

npz文件的一个缺点是它们无法进行内存映射(使用load(<file>, mmap_mode='r')),因此对于大型数组,它们可能不是最佳选择。对于数组具有共同形状的数据,建议您参考structured arrays。它们可以进行内存映射,允许使用类似dict的语法(即arr['field'])访问数据,并且在内存方面非常有效。