Python:使用`pickle`或`marshal`并使用`re`的性能比较

Tia*_* Li 4 python performance serialization deserialization

我正在使用Python计算一些非常大的数字,我想将以前计算的结果存储在Berkeley DB中.

问题是Berkeley DB必须使用字符串,我必须为计算结果存储一个整数元组.

例如,我得到(m, n)了我的结果,一种方法是将其存储为"%d,%d" % (m, n)并使用它读出来re.我也可以使用pickle或存储元组marshal.

哪个有更好的表现?

Jim*_*ian 7

当有人在考虑性能时,他应该记住三件事:

  • 不要相信任何人 - 任何基准都可能撒谎(出于不同的原因:不专业、营销等)
  • 始终衡量您的情况 - 例如,缓存系统和统计数据有完全不同的要求。在一种情况下,您需要尽可能快地阅读,在另一种情况下 - 写
  • 重复测试 - 任何软件的新版本都可能更快/更慢,因此任何更新都可能带来好处/惩罚

例如,这是我的基准测试结果:

jimilian$ python3.5 serializators.py
iterations= 100000
data= 'avzvasdklfjhaskldjfhkweljrqlkjb*@&$Y)(!#&$G@#lkjabfsdflb(*!G@#$(GKLJBmnz,bv(PGDFLKJ'
==== DUMP ====
Pickle:
>> 0.09806302400829736
Json: 2.0.9
>> 0.12253901800431777
Marshal: 4
>> 0.09477431800041813
Msgpack: (0, 4, 7)
>> 0.16701826300413813

==== LOAD ====
Pickle:
>> 0.10376790800364688
Json: 2.0.9
>> 0.30041573599737603
Marshal: 4
>> 0.034003349996055476
Msgpack: (0, 4, 7)
>> 0.061493027009419166

jimilian$ python3.5 serializators.py
iterations= 100000
data= [1,2,3]*100
==== DUMP ====
Pickle:
>> 0.9678693519963417
Json: 2.0.9
>> 4.494351467001252
Marshal: 4
>> 0.8597690019960282
Msgpack: (0, 4, 7)
>> 1.2778299400088144

==== LOAD ====
Pickle:
>> 1.0350999219954247
Json: 2.0.9
>> 3.349724347004667
Marshal: 4
>> 0.468191737003508
Msgpack: (0, 4, 7)
>> 0.3629750510008307

jimilian$ python2.7 serializators.py
iterations= 100000
data= [1,2,3]*100
==== DUMP ====
Pickle:
>> 50.5894570351
Json: 2.0.9
>> 2.69190311432
cPickle: 1.71
>> 5.14689707756
Marshal: 2
>> 0.539206981659
Msgpack: (0, 4, 7)
>> 0.752672195435

==== LOAD ====
Pickle:
>> 58.8052768707
Json: 2.0.9
>> 3.50090789795
cPickle: 1.71
>> 8.46298909187
Marshal: 2
>> 0.469168901443
Msgpack: (0, 4, 7)
>> 0.315001010895
Run Code Online (Sandbox Code Playgroud)

因此,正如您所看到的Pickle,有时msgpack在 python2 中使用(python3, long string, dump)更好,有时使用 - (python3, long array, load) - 事情完全不同。这就是为什么没有人可以给出对每个人都有效的确定答案。


Amb*_*ber 6

对于纯粹的速度,marshal将获得最快的结果.

时序:

>>> timeit.timeit("pickle.dumps([1,2,3])","import pickle",number=10000)
0.2939901351928711
>>> timeit.timeit("json.dumps([1,2,3])","import json",number=10000)
0.09756112098693848
>>> timeit.timeit("pickle.dumps([1,2,3])","import cPickle as pickle",number=10000)
0.031056880950927734
>>> timeit.timeit("marshal.dumps([1,2,3])","import marshal", number=10000)
0.00703883171081543
Run Code Online (Sandbox Code Playgroud)