--

python: 利用pickle进行对象永久序列化


有时候我们需要从内存中保存一些内容到磁盘空间上,以便下一次我们可以直接从中间的结果开始,这个时候pickle 是很有用处的。

pickle 的用法很简单,基本上用到的就是两个函数,一个是dump,一个是load。

  import pickle
  a = [1,2,3]
  b = [4,5,6]
  with open('dump.pkl', 'wb') as f:
      pickle.dump(
      {
          'value_a': a,
          'value_b': b
      }, f, pickle.HIGHEST_PROTOCOL)

  with open('dump.pkl', 'rb') as f:
      pickle_data = pickle.load(f)
      c = pickle_data['value_a']
      d = pickle_data['value_b']

  print(c)
  print(d)
  
很好,这样a 和b被写入到了序列化文件dump.pkl中,而c和d 又从这个文件中加载了回来。

那么pickle 的使用有什么限制呢?

1. pickle 在数据非常大的时候可能会有点慢,没关系,我们另外有一个用c来实现的cPickle模块,速度很快。

你可以这样用, 以便在你有cPickle 的时候优先使用cPickle

  try:
      import cPickle as pickle
  except ImportError:
      import pickle  
  
2. pickle 不是原子化操作,所以在多线程大规模并行化的时候可能有问题。

3. pickle 文件在python 中格式是通用的,但是与其他的编程语言(c,javascript等)不一定兼容。 不像JSON 那样通用。