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

我想保存一个dict或数组。


我尝试与np.save和一起使用pickle,发现前者总是花费更少的时间。


我的实际数据要大得多,但在这里我只展示一小段用于演示目的:


import numpy as np

#import numpy.array as array

import time

import pickle


b = {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什么时候应该使用?


慕村225694
浏览 183回答 3
3回答

梦里花落0921

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

人到中年有点甜

这是因为pickle可以在各种Python对象上使用纯Python编写,而np.save专为数组设计并以有效格式保存它们。从numpy.save文档中,它实际上可以在幕后使用pickle。这可能会限制Python版本之间的可移植性,并存在执行任意代码的风险(这是在解开未知对象时的普遍风险)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python