Легкий рассол для основных типов в питоне? - PullRequest
7 голосов
/ 10 февраля 2009

Все, что я хочу сделать, это сериализовать и десериализовать кортежи строк или целых чисел.

Я посмотрел на pickle.dumps (), но затраты байтов значительны. По сути, похоже, что он занимает примерно в 4 раза больше места, чем нужно. Кроме того, все, что мне нужно, это базовые типы и не нужно сериализовать объекты.

маршал немного лучше с точки зрения пространства, но результат полон неприятных \ x00 байтов. В идеале я хотел бы, чтобы результат был удобочитаемым.

Я думал о том, чтобы просто использовать repr () и eval (), но есть ли простой способ сделать это без использования eval ()?

Это сохраняется в БД, а не в файле. Издержки байтов имеют значение, потому что это может иметь значение между требованием столбца TEXT по сравнению с varchar, и, как правило, компактность данных влияет на все области производительности БД.

Ответы [ 7 ]

13 голосов
/ 10 февраля 2009

Посмотрите на json , по крайней мере, сгенерированные dumps доступны для чтения на многих других языках.

JSON (нотация объектов JavaScript) http://json.org - это подмножество синтаксиса JavaScript (ECMA-262, 3-е издание), используемое в качестве облегченного формата обмена данными.

8 голосов
/ 10 февраля 2009

Возможно, вы не используете правильный протокол:

>>> import pickle
>>> a = range(1, 100)
>>> len(pickle.dumps(a))
492
>>> len(pickle.dumps(a, pickle.HIGHEST_PROTOCOL))
206

См. Документацию для форматов данных pickle .

8 голосов
/ 10 февраля 2009

лично я бы использовал yaml . он соответствует паритету json по размеру кодирования, но может при необходимости представлять некоторые более сложные вещи (например, классы, рекурсивные структуры).

In [1]: import yaml
In [2]: x = [1, 2, 3, 'pants']
In [3]: print(yaml.dump(x))
[1, 2, 3, pants]

In [4]: y = yaml.load('[1, 2, 3, pants]')
In [5]: y
Out[5]: [1, 2, 3, 'pants']
6 голосов
/ 10 февраля 2009

Если вам нужно компактное решение, вы можете использовать буферы протокола Google.

Буферы протокола - Кодировка

Буферы протокола - Python Tutorial

1 голос
/ 10 февраля 2009

В документации python упоминаются некоторые встроенные средства персистентности, но я не думаю, что что-то из этого значительно меньше в создаваемых файлах.

Вы всегда можете использовать configparser , но там вы получите только string, int, float, bool.

0 голосов
/ 17 сентября 2009

К счастью, есть решение, которое использует сжатие и решает общая проблема, связанная с любым произвольным объектом Python в том числе новые классы. Вместо того, чтобы просто управлять микро иногда кортежам лучше использовать СУХОЙ инструмент.
Ваш код будет более четким и легко переработанным в подобных будущих ситуациях.

модуль y_serial.py :: хранилище объектов Python с SQLite

"Сериализация + постоянство :: в несколько строк кода сжимают и аннотируют объекты Python в SQLite, а затем извлекают их в хронологическом порядке по ключевым словам без какого-либо SQL. Наиболее полезный" стандартный "модуль для базы данных для хранения данных без схемы . "

http://yserial.sourceforge.net

[Если вы все еще обеспокоены, почему бы не вставить эти кортежи в словарь, затем примените y_serial к словарю. Вероятно, любые накладные расходы исчезнут из-за прозрачного сжатие в фоновом режиме с помощью zlib.]

Что касается читабельности, документация также дает подробную информацию о почему cPickle был выбран над JSON.

0 голосов
/ 10 февраля 2009

"значительная нагрузка байта"

Почему это имеет значение? Это делает работу. Если у вас мало места на диске, я был бы рад продать вам 1 Тб за 500 долларов.

Ты управлял им? Является ли производительность проблемой? Можете ли вы продемонстрировать, что производительность сериализации составляет проблема ?

«Я думал просто об использовании repr () и eval (), но есть ли простой способ сделать это без использования eval ()?»

Нет ничего проще, чем repr и eval.

Что не так с eval?

Является ли проблема "кто-то может вставить вредоносный код в файл, в котором я сериализовал свои списки"?

Кто, в частности, собирается найти и отредактировать этот файл для вставки вредоносного кода? Все, что вы делаете для защиты этого (то есть шифрование), удаляет из него «простое».

...