Python: сравнение производительности использования `pickle` или` marshal` и использования `re` - PullRequest
4 голосов
/ 12 марта 2012

Я вычисляю несколько очень больших чисел с помощью Python, и я хотел бы сохранить ранее вычисленные результаты в Berkeley DB.

Проблема в том, что Berkeley DB должен использовать строки, и мне нужно сохранитьцелочисленный кортеж для результатов расчета.

Например, в качестве результата я получаю (m, n), один из способов - сохранить его как "%d,%d" % (m, n) и прочитать его, используя re.Я также могу сохранить кортеж, используя pickle или marshal.

Какая производительность лучше?

Ответы [ 4 ]

6 голосов
/ 12 марта 2012

Для чистой скорости 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
4 голосов
/ 25 июня 2016

Когда кто-то думает о производительности, он должен помнить 3 вещи:

  • Не доверяйте никому - любой эталон может лгать (по разным причинам: непрофессионал, маркетинг и т. Д.)
  • Всегда измеряйте свой случай - например, кеш-система и статистика предъявляют совершенно разные требования. В одном случае нужно читать как можно быстрее, в другом - написать
  • Повторите тесты - новая версия любого программного обеспечения может быть быстрее / медленнее, поэтому любое обновление может вводить преимущества / штрафы

Например, вот результаты моего теста :

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

Итак, как вы можете видеть, иногда лучше использовать Pickle (python3, long string, dump), иногда - msgpack (python3, long array, load), в python2 - все работает совершенно по-другому. Вот почему никто не может дать определенный ответ, который будет действительным для всех (ожидайте этого;)).

3 голосов
/ 12 марта 2012

Время их и узнайте!

Я бы ожидал, что cPickle будет самым быстрым, но это не гарантия.

1 голос
/ 12 марта 2012

Извлеките shelve , простое постоянное хранилище значений ключей с API-интерфейсом, подобным словарю, который использует pickle для сериализации объектов.

...