¿Encurtidos ligeros para tipos básicos en python?

Todo lo que quiero hacer es serializar y deserializar tuplas de cadenas o ints.

Miré pickle.dumps () pero la sobrecarga de bytes es significativa. Básicamente, parece que ocupa aproximadamente 4 veces la cantidad de espacio que necesita. Además, todo lo que necesito son tipos básicos y no tengo necesidad de serializar objetos.

Marshal es un poco mejor en términos de espacio, pero el resultado está lleno de \ x00 bytes desagradables. Idealmente, me gustaría que el resultado fuera legible para los humanos.

Pensé en usar repr () y eval (), pero ¿hay alguna forma sencilla de lograr esto sin usar eval ()?

Esto se está almacenando en una base de datos, no un archivo. La sobrecarga de bytes es importante porque podría hacer la diferencia entre requerir una columna de TEXTO y una varchar, y en general la compacidad de los datos afecta a todas las áreas del rendimiento de la base de datos.

Personalmente usaría yaml . está a la par con json para el tamaño de la encoding, pero puede representar algunas cosas más complejas (por ejemplo, clases, estructuras recursivas) cuando sea necesario.

 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'] 

Tal vez no estés usando el protocolo correcto:

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

Consulte la documentación para los formatos de datos de salmuera .

Si necesita una solución eficiente en espacio, puede usar los buffers de Google Protocol.

Búferes de protocolo – Codificación

Buffer de protocolo – Tutorial de Python

Hay algunos elementos de persistencia mencionados en la documentación de python, pero no creo que ninguno de estos sea notable más pequeño en el tamaño de archivo producido.

Siempre se puede usar el configparser pero allí solo se obtiene string, int, float, bool.

“la sobrecarga de bytes es significativa”

¿Por qué importa esto? Hace el trabajo. Si se está quedando sin espacio en el disco, me complacería venderle 1 TB por $ 500.

¿Lo has ejecutado? ¿Es el rendimiento un problema? ¿Puedes demostrar que el rendimiento de la serialización es el problema?

“Pensé en usar repr () y eval (), pero ¿hay alguna forma sencilla de lograr esto sin usar eval ()?”

Nada más sencillo que repr y eval.

¿Qué pasa con eval?

¿Es el problema “alguien podría insertar código malicioso en el archivo donde serialicé mis listas”?

¿Quién, específicamente, va a encontrar y editar este archivo para incluir un código malicioso? Cualquier cosa que haga para asegurar esto (es decir, el cifrado) elimina “simple” de ello.

Afortunadamente, existe una solución que utiliza COMPRESIÓN y resuelve el problema general que involucra cualquier objeto Python arbitrario, incluidas las nuevas clases. En lugar de microgestionar meras tuplas, a veces es mejor usar una herramienta DRY.
Su código será más nítido y será fácilmente refaccionado en situaciones futuras similares.

y_serial.py module :: warehouse objetos de Python con SQLite

“Serialización + persistencia :: en unas pocas líneas de código, comprima y anote los objetos de Python en SQLite; luego, recupérelos cronológicamente mediante palabras clave sin ningún tipo de SQL. El módulo” estándar “más útil para que una base de datos almacene datos sin esquema”.

http://yserial.sourceforge.net

[Si aún está preocupado, ¿por qué no pegar esas tuplas en un diccionario, luego aplique y_serial al diccionario? Probablemente cualquier sobrecarga se desvanecerá debido a la compresión transparente en el fondo por zlib.]

En cuanto a la legibilidad, la documentación también da detalles sobre por qué se seleccionó cPickle sobre json.