È effettivamente possibile uso dill
a Pickle esso. Le versioni più recenti di dill
(ad esempio su github) hanno "impostazioni" che consentono varianti di come il pickle è costruito su dump
. Sì, le impostazioni predefinite per dill
non riescono su questo oggetto, ma non se si utilizza l'impostazione che traccia ricorsivamente riferimenti globali (ad esempio recurse = True
). Questa impostazione è simile a quella fornita da cloudpickle
per impostazione predefinita.
>>> import sympy as sym
>>> import pickle
>>> import dill
>>> a, b = symbols("a, b")
>>> a, b = sym.symbols("a, b")
>>> expr = sym.sin(a) + sym.cos(b)
>>> lambdified_expr = sym.lambdify((a, b), expr, modules="numpy")
>>>
>>> dill.settings
{'recurse': False, 'byref': False, 'protocol': 2, 'fmode': 0}
>>> dill.settings['recurse'] = True
>>> dill.dumps(lambdified_expr)
'\x80\x02cdill.dill\n_create_function\nq\x00(cdill.dill\n_unmarshal\nq\x01U\x83c\x02\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00C \x00\x00s\x14\x00\x00\x00t\x00\x00|\x00\x00\x83\x01\x00t\x01\x00|\x01\x00\x83\x01\x00\x17S(\x01\x00\x00\x00N(\x02\x00\x00\x00t\x03\x00\x00\x00sint\x03\x00\x00\x00cos(\x02\x00\x00\x00t\x01\x00\x00\x00at\x01\x00\x00\x00b(\x00\x00\x00\x00(\x00\x00\x00\x00s\x08\x00\x00\x00<string>t\x08\x00\x00\x00<lambda>\x01\x00\x00\x00s\x00\x00\x00\x00q\x02\x85q\x03Rq\x04}q\x05(U\x03cosq\x06cnumpy.core.umath\ncos\nq\x07U\x03sinq\x08cnumpy.core.umath\nsin\nq\tuU\x08<lambda>q\nNN}q\x0btq\x0cRq\r.'
P.S. Sono l'autore dill
, quindi lo saprei.
fonte
2015-07-15 15:54:50
perché recurse = True non è un'opzione predefinita? – denfromufa
Poiché 'dill' può serializzare una vasta gamma di oggetti e' recurse = False' fornisce la più ampia gamma di copertura. Se si utilizza 'recurse = True', funziona molto bene per determinati oggetti, ma interrompe la serializzazione per un numero di casi. Se (o quando) risolvo i casi che si rompono, diventerà il default. Fino ad allora, la scelta migliore è * non * rimuovere la funzionalità predefinita, ma fornire nuove funzionalità tramite un'impostazione. Vedi: https://github.com/uqfoundation/dill/issues/105 –
@MikeMcKerns Ho un avvertimento, per le funzioni lambadified ragionevolmente grandi ottengo 'RuntimeError: massima profondità di ricorsione superata mentre si chiama un oggetto Python'. –