Skip to main content
 首页 » 编程设计

python之为什么 pickle 比 np.save 花费的时间长得多

2025年05月04日10mfryf

我想保存一个 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])]} 
 
 
start_time = time.time() 
with open('testpickle', 'wb') as myfile: 
    pickle.dump(b, myfile) 
print("--- Time to save with pickle: %s milliseconds ---" % (1000*time.time() - 1000*start_time)) 
 
start_time = time.time() 
np.save('numpy', b) 
print("--- Time to save with numpy: %s milliseconds ---" % (1000*time.time() - 1000*start_time)) 
 
start_time = time.time() 
with open('testpickle', 'rb') as myfile: 
    g1 = pickle.load(myfile) 
print("--- Time to load with pickle: %s milliseconds ---" % (1000*time.time() - 1000*start_time)) 
 
start_time = time.time() 
g2 = np.load('numpy.npy') 
print("--- Time to load with numpy: %s milliseconds ---" % (1000*time.time() - 1000*start_time)) 

给出输出:

--- Time to save with pickle: 4.0 milliseconds --- 
--- Time to save with numpy: 1.0 milliseconds --- 
--- Time to load with pickle: 2.0 milliseconds --- 
--- Time to load with numpy: 1.0 milliseconds --- 

时间差异与我的实际大小(字典中约 100,000 个键)更加明显。

为什么 pickle 比 np.save 花费更长的时间来保存和加载?

什么时候应该使用pickle?

请您参考如下方法:

因为只要写入的对象不包含Python数据,

  • numpy 对象在内存中的表示方式比 Python 对象简单得多
  • numpy.save 是用 C 语言编写的
  • numpy.save 以需要最少处理的超简单格式写入

同时

  • Python 对象有很多开销
  • pickle 是用 Python 编写的
  • pickle 将数据从内存中的底层表示显着转换为写入磁盘的字节

请注意,如果一个 numpy 数组确实包含 Python 对象,那么 numpy 只会 pickle 数组,所有的胜利都会消失。