为了账号安全,请及时绑定邮箱和手机立即绑定

为什么泡菜比np.save花费更长的时间?

为什么泡菜比np.save花费更长的时间?

慕村225694 2021-05-05 10:22:08
我想保存一个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只会腌制该数组,所有胜利就出在窗外。


查看完整回答
反对 回复 2021-05-25
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

这是因为pickle可以在各种Python对象上使用纯Python编写,而np.save专为数组设计并以有效格式保存它们。

numpy.save文档中,它实际上可以在幕后使用pickle。这可能会限制Python版本之间的可移植性,并存在执行任意代码的风险(这是在解开未知对象时的普遍风险)。


查看完整回答
反对 回复 2021-05-25
  • 3 回答
  • 0 关注
  • 182 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号