2009-03-20 12 views
9

Wurden defaultdict's ab Python 2.6 nicht marshalbar? Folgende Werke werden unter 2.5, nicht unter 2,6 mit "Valueerror: unmarshallable Objekt" auf OS X 1.5.6, Python-2.6.1-macosx2008-12-06.dmg von python.org:Python: defaultdict wurde in 2.6 zum unmarshalbaren Objekt?

from collections import defaultdict 
import marshal 
dd = defaultdict(list) 
marshal.dump(dd, file('/tmp/junk.bin','wb')) 

Antwort

11

Marshal was deliberately changed to not support subclasses of built-in types. Marshal sollte niemals mit den Standardwerten zurechtkommen, aber das passierte, da sie eine Unterklasse des Diktats sind. Marshal is not a general "persistence" module; only None, integers, long integers, floating point numbers, strings, Unicode objects, tuples, lists, sets, dictionaries, and code objects are supported.

Python 2.5:

>>> marshal.dumps(defaultdict(list)) 
'{0' 
>>> marshal.dumps(dict()) 
'{0' 

Wenn aus irgendeinem Grund wollen Sie wirklich einen defaultdict Marschall Sie es zu einem dict ersten umwandeln kann, aber Chancen sind, sollten Sie einen anderen Serialisierungsmechanismus verwenden, wie pickling.

+0

Danke Miles. Problem ist, dass es einen sehr signifikanten Leistungsunterschied zwischen Beizen und Marshalling gibt - bei der Datengröße, mit der ich arbeite, beträgt sie für jeden Lauf ein paar Stunden. Ich denke, ich bleibe bei 2.5 oder konvertiere zu einem Diktat vor Marshalling. – Parand

+0

Verwenden Sie cPickle mit HIGHEST_PROTOCOL? – Miles

7

WRT Leistungsprobleme .. kodierend eine Liste von ~ 600000 dicts, jeweils mit 4 Schlüssel/Wert, einer der Werte hat eine Liste (etwa 1-3 Länge) von 2 Haupt/val dicts:

In [27]: timeit(cjson.encode, data) 
4.93589496613 

In [28]: timeit(cPickle.dumps, data, -1) 
141.412974119 

In [30]: timeit(marshal.dumps, data, marshal.version) 
1.13546991348 
+1

gc.disable(); Zeit (cPickle.dumps, ...); gc.enable() verkürzt die Zeit auf etwa 14 Sekunden, was eine gute Verbesserung sein könnte. –

+0

Hier sind ähnliche Benchmarks zu finden und Marshal ist etwa 15 Mal schneller als cPickle für Wörterbücher und Listen auf meinem BeagleBoard. Hätte nie gedacht, dass das der Fall wäre. Danke @dsvensson für die freie Erleuchtung. –