Python pickle no uno a uno: diferentes pickles dan el mismo objeto

¿Alguien puede explicar esto?

pickle.loads(b'\x80\x03X\x01\x00\x00\x00.q\x00h\x00\x86q\x01.') == pickle.loads(b'\x80\x03X\x01\x00\x00\x00.q\x00X\x01\x00\x00\x00.q\x01\x86q\x02.') >>>True pickle.loads(b'\x80\x03X\x01\x00\x00\x00.q\x00h\x00\x86q\x01.') >>>('.', '.') pickle.loads(b'\x80\x03X\x01\x00\x00\x00.q\x00X\x01\x00\x00\x00.q\x01\x86q\x02.') >>>('.', '.') 

Parece que hay una versión larga y corta en escabeche de tuplas con el mismo elemento repetidamente.

Otros ejemplos:

 pickle.loads(b'\x80\x03X\x01\x00\x00\x00#q\x00X\x01\x00\x00\x00#q\x01\x86q\x02.') >>>('#', '#') pickle.loads(b'\x80\x03X\x01\x00\x00\x00#q\x00h\x00\x86q\x01.') >>>('#', '#') pickle.loads(b'\x80\x03X\x01\x00\x00\x00$q\x00X\x01\x00\x00\x00$q\x01\x86q\x02.') >>>('$', '$') pickle.loads(b'\x80\x03X\x01\x00\x00\x00$q\x00h\x00\x86q\x01.') >>>('$', '$') 

Estoy tratando de indexar los elementos por su pickle pero no los encuentro porque sus pickles parecen estar cambiando.

Estoy usando Python 3.3.2 en Ubuntu.

Los pepinillos no son únicos; El formato de pickle es en realidad un pequeño lenguaje de progtwigción , y diferentes progtwigs (pickles) pueden producir la misma salida (objeto no seleccionado). De los documentos:

Dado que el formato de datos de pickle es en realidad un pequeño lenguaje de progtwigción orientado a la stack, y se toma cierta libertad en las codificaciones de ciertos objetos, es posible que los dos módulos [pickle y cPickle] produzcan flujos de datos diferentes para los mismos objetos de entrada. Sin embargo, se garantiza que siempre podrán leer los flujos de datos de cada uno.

Incluso hay una función pickletools.optimize que tomará un pickle y producirá un pickle mejor. Vas a necesitar rediseñar tu progtwig.