反序列化速度慢_第八章(第4节):序列化

当程序运行起来时(也就是进程),所有的变量都保存在内存中, 当进程结束后,该进程申请的内存都要被操作系统回收,我们在内存中的数据就会丢失, 如果想使数据持久化,我们可以把数据存储在磁盘上。 但是文件对象只能处理字符流,如果我们要存储的数据类型为其它类型(int,float,bool,list,tuple,dict等等)应该怎么办呢。

不但读写磁盘需要通过文件对象,网络传输数据也需要通过文件对象,因为网络 IO 是指通过文件对象是读写网卡而已,磁盘 IO 是指通过文件对象读写磁盘而已。我们知道文件对象只能处理字符流,如果我们想把非字符类型(int,float,bool,list,tuple,dict等等)的数据通过网络发送到其它机器上应该怎么办呢。

根据以上两个问题,我们本节课就来学习一下序列化:我们把变量从内存中变成可存储或传输的过程(也就是变成字符流的过程),称之为序列化,序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。 反之,能把序列化后的字符流还原成序列化之前的类型数据的过程叫反序列化。

pickle 模块

在 Python 中有两个模块可以对数据进行序列化和反序列化:cPickle 和 pickle。这两个模块功能是一样的,区别在于 cPickle 是 C 语言写的,速度快;pickle 是纯 Python 写的,速度慢。我们用的时候可以先尝试导入 cPickle,如果失败,再导入 pickle。

try:
    import cPickle as pickle
except ImportError:
    import pickle

mylist = [1, True, "hello"]
seqdata = pickle.dumps(mylist)   # 序列化成字符流
print(type(seqdata))             # list 类型数据 序列化成 str 类型
print(seqdata)                   # 序列化后的字符流

mylistreseq = pickle.loads(seqdata)  # 把被序列化的字符流反序列化成 list
print(type(mylistreseq))             # list 类型
print(mylistreseq)                   # 反序列化后的 list

我们可以把 Python 内置的各种类型的数据序列化成字符流数据,然后用文件对象存储到磁盘上。 同样,我们也可以用文件对象读出这些序列化后的字符流,然后反序列化成它原来的类型数据到内存中。 注意:在 Python 3 中,把用 pickle 序列化后的字符流存储到磁盘,必须以 wb 的形式;同样,从磁盘上读取用 pickle 序列化后的字符流用 rb 的形式。

try:
    import cPickle as pickle
except ImportError:
    import pickle

mylist = [1, True, ("hello", None)]
f = open("d:/test.txt", "wb")
seqdata = pickle.dumps(mylist)       # 序列化成字符流
f.write(seqdata)
f.close()

f = open("d:/test.txt", "rb")
seqdata = f.read()
f.close()
mylistreseq = pickle.loads(seqdata)  # 反序列化后的 list
print(mylistreseq)

对于我们自定义类型,同样

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本JSON是基于JAVA8编写,对比阿里的JSON三次测试结果如下: 10万次序列,1万次序列,毫秒。 阿里序列时间 1122 1054 1115 阿里序列时间 409 423 412 HZS序列时间 884 864 880 HZS序列时间 392 375 394 JAVA7版已经逼近阿里的速度,JAVA8版利用了闭包技术,充份发挥多核优势,已经超过阿里的速度。 测试代码如下: { org.hzs.json.JSONObject bjson; java.util.LinkedList<String> jd_Set = new java.util.LinkedList<>(); java.util.Random d1 = new java.util.Random(); java.util.UUID d2; int ji_i; long ji起始时间_i; long ji截至时间_i; java.util.Date date = new java.util.Date(); //生成1万个序列後的文本 for (ji_i = 0; ji_i < 10000; ji_i++) { bjson = org.hzs.json.JSONObject.d副本(); bjson.put("a1", d1.nextDouble()); bjson.put("a2", d1.nextDouble()); bjson.put("a3", d1.nextDouble()); bjson.put("a4", d1.nextInt()); bjson.put("a5", d1.nextInt()); bjson.put("a6", d1.nextLong()); bjson.put("a7", d1.nextBoolean()); d2 = java.util.UUID.randomUUID(); bjson.put("b1", d2.toString()); d2 = java.util.UUID.randomUUID(); bjson.put("b2", d2.toString()); d2 = java.util.UUID.randomUUID(); bjson.put("b3", d2.toString()); d2 = java.util.UUID.randomUUID(); bjson.put("b4", d2.toString()); bjson.put("c", new java.util.Date()); jd_Set.add(bjson.toString()); } com.alibaba.fastjson.JSONObject ajson, a1json = new com.alibaba.fastjson.JSONObject(); ji起始时间_i = java.util.Calendar.getInstance().getTimeInMillis(); for (ji_i = 0; ji_i < 100000; ji_i++) { ajson = (com.alibaba.fastjson.JSONObject) a1json.clone(); ajson.put("a1", d1.nextDouble()); ajson.put("a2", d1.nextDouble()); ajson.put("a3", d1.nextDouble()); ajson.put("a4", d1.nextInt()); ajson.put("a5", d1.nextInt()); ajson.put("a6", d1.nextLong()); ajson.put("a7", d1.nextBoolean()); d2 = java.util.UUID.randomUUID(); ajson.put("b1", d2.toString()); d2 = java.util.UUID.randomUUID(); ajson.put("b2", d2.toString()); d2 = java.util.UUID.randomUUID(); ajson.put("b3", d2.toString()); d2 = java.util.UUID.randomUUID(); ajson.put("b4", d2.toString()); ajson.put("c", new java.util.Date()); ajson.toString(); } ji截至时间_i = java.util.Calendar.getInstance().getTimeInMillis(); System.out.print("阿里变量序列时间:"); System.out.println(ji截至时间_i - ji起始时间_i); ji起始时间_i = java.util.Calendar.getInstance().getTimeInMillis(); for (ji_i = 0; ji_i < 10000; ji_i++) { ajson = com.alibaba.fastjson.JSONObject.parseObject(jd_Set.get(ji_i)); } ji截至时间_i = java.util.Calendar.getInstance().getTimeInMillis(); System.out.print("阿里序列时间:"); System.out.println(ji截至时间_i - ji起始时间_i); ji起始时间_i = java.util.Calendar.getInstance().getTimeInMillis(); for (ji_i = 0; ji_i < 100000; ji_i++) { bjson = org.hzs.json.JSONObject.d副本(); bjson.put("a1", d1.nextDouble()); bjson.put("a2", d1.nextDouble()); bjson.put("a3", d1.nextDouble()); bjson.put("a4", d1.nextInt()); bjson.put("a5", d1.nextInt()); bjson.put("a6", d1.nextLong()); bjson.put("a7", d1.nextBoolean()); d2 = java.util.UUID.randomUUID(); bjson.put("b1", d2.toString()); d2 = java.util.UUID.randomUUID(); bjson.put("b2", d2.toString()); d2 = java.util.UUID.randomUUID(); bjson.put("b3", d2.toString()); d2 = java.util.UUID.randomUUID(); bjson.put("b4", d2.toString()); bjson.put("c", new java.util.Date()); bjson.toString(); } ji截至时间_i = java.util.Calendar.getInstance().getTimeInMillis(); System.out.print("HZS变量序列时间:"); System.out.println(ji截至时间_i - ji起始时间_i); ji起始时间_i = java.util.Calendar.getInstance().getTimeInMillis(); for (ji_i = 0; ji_i < 10000; ji_i++) { bjson = org.hzs.json.JSONObject.d副本(jd_Set.get(ji_i)); } ji截至时间_i = java.util.Calendar.getInstance().getTimeInMillis(); System.out.print("HZS序列时间:"); System.out.println(ji截至时间_i - ji起始时间_i); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值