我想保存一个dict或数组。我尝试与np.save和一起使用pickle,发现前者总是花费更少的时间。我的实际数据要大得多,但在这里我只展示一小段用于演示目的:import numpy as np#import numpy.array as arrayimport timeimport pickleb = {0: [np.array([0, 0, 0, 0])], 1: [np.array([1, 0, 0, 0]), np.array([0, 1, 0, 0]), np.array([0, 0, 1, 0]), np.array([0, 0, 0, 1]), np.array([-1, 0, 0, 0]), np.array([ 0, -1, 0, 0]), np.array([ 0, 0, -1, 0]), np.array([ 0, 0, 0, -1])], 2: [np.array([2, 0, 0, 0]), np.array([1, 1, 0, 0]), np.array([1, 0, 1, 0]), np.array([1, 0, 0, 1]), np.array([ 1, -1, 0, 0]), np.array([ 1, 0, -1, 0]), np.array([ 1, 0, 0, -1])], 3: [np.array([1, 0, 0, 0]), np.array([0, 1, 0, 0]), np.array([0, 0, 1, 0]), np.array([0, 0, 0, 1]), np.array([-1, 0, 0, 0]), np.array([ 0, -1, 0, 0]), np.array([ 0, 0, -1, 0]), np.array([ 0, 0, 0, -1])], 4: [np.array([2, 0, 0, 0]), np.array([1, 1, 0, 0]), np.array([1, 0, 1, 0]), np.array([1, 0, 0, 1]), np.array([ 1, -1, 0, 0]), np.array([ 1, 0, -1, 0]), np.array([ 1, 0, 0, -1])], 5: [np.array([0, 0, 0, 0])], 6: [np.array([1, 0, 0, 0]), np.array([0, 1, 0, 0]), np.array([0, 0, 1, 0]), np.array([0, 0, 0, 1]), np.array([-1, 0, 0, 0]), np.array([ 0, -1, 0, 0]), np.array([ 0, 0, -1, 0]), np.array([ 0, 0, 0, -1])], 2: [np.array([2, 0, 0, 0]), np.array([1, 1, 0, 0]), np.array([1, 0, 1, 0]), np.array([1, 0, 0, 1]), np.array([ 1, -1, 0, 0]), np.array([ 1, 0, -1, 0]), np.array([ 1, 0, 0, -1])], 7: [np.array([1, 0, 0, 0]), np.array([0, 1, 0, 0]), np.array([0, 0, 1, 0]), np.array([0, 0, 0, 1]), np.array([-1, 0, 0, 0]), np.array([ 0, -1, 0, 0]), np.array([ 0, 0, -1, 0]), np.array([ 0, 0, 0, -1])], 8: [np.array([2, 0, 0, 0]), np.array([1, 1, 0, 0]), np.array([1, 0, 1, 0]), np.array([1, 0, 0, 1]), np.array([ 1, -1, 0, 0]), np.array([ 1, 0, -1, 0]), np.array([ 1, 0, 0, -1])]}我的实际大小(字典中约有100,000个键)时差更加明显。为什么在保存和加载时,泡菜要比np.save花费更长的时间?我pickle什么时候应该使用?
3 回答

梦里花落0921
TA贡献1772条经验 获得超6个赞
因为只要书面对象不包含Python数据,
numpy对象在内存中的表示方式比Python对象简单得多
numpy.save用C编写
numpy.save以超简单的格式写,需要最少的处理
同时
Python对象有很多开销
pickle用Python编写
pickle可以将数据从内存中的基本表示形式转换为要写入磁盘的字节形式
请注意,如果一个numpy数组确实包含Python对象,那么numpy只会腌制该数组,所有胜利就出在窗外。

人到中年有点甜
TA贡献1895条经验 获得超7个赞
这是因为pickle
可以在各种Python对象上使用纯Python编写,而np.save
专为数组设计并以有效格式保存它们。
从numpy.save文档中,它实际上可以在幕后使用pickle。这可能会限制Python版本之间的可移植性,并存在执行任意代码的风险(这是在解开未知对象时的普遍风险)。
添加回答
举报
0/150
提交
取消