Je calcule des nombres très gros utilisant Python, et j'aimerais stocker des résultats précédemment calculés à Berkeley DB. P>
Le problème est que Berkeley DB doit utiliser des chaînes et je dois stocker un tuple entier pour les résultats de calcul. P>
Par exemple, je reçois qui a la meilleure performance? p> (m, n) code> comme mon résultat, une solution consiste à stocker cela comme
"% d,% d"% (m, n) code > et lisez-le en utilisant
re code>. Je peux également stocker le tuple en utilisant
cornichon code> ou
maréchal code>. P>
4 Réponses :
TEMPS TIME ET CONSULTER! P>
Je m'attendrais à ce que CPickle soit le plus rapide, mais ce n'est pas une garantie. P>
Notez que l'OP ne mentionne pas une version Python, et cpickle code> n'existe pas séparément de
Pickle code> dans py3 -
cornichon code> fournira l'optimisation La version de celui-ci existe et retombe à la version pure-Python autrement.
pour la vitesse pure, horaires: p> maréchal code> vous obtiendra les résultats les plus rapides.
Il s'avère également que si je ne veux pas que ce soit être lisible par l'homme, le maréchal est plus rapide.
J'ai testé le maréchal contre le msgpack mais le maréchal gagné en termes de vitesse. Temps de maréchal AVG pour 15000 opérations sur une petite liste = 0.0003171195348103841, heure de msgpack pour le même test = 0.0008052133083343506. Je n'ai pas vu l'utilisation de l'espace si ...
Gardez à l'esprit cet avertissement de Marshal Docs: DOCS.PYTHON.ORG/LIBRARY/MARSHAL.HTMLLLUT A> Avertissement Le module maréchal n'est pas destiné à être sécurisé contre des données erronées ou malicieuses. Ne jamais lamarser les données reçues d'une source non approuvée ou non autorisée.
@Urjit la même chose est dit pour le cornichon. Ce ne serait pas la raison de choisir l'un sur l'autre.
Quand quelqu'un pense à la performance, il devrait se souvenir de 3 choses:
Par exemple, voici les résultats de mon Benchmark : P >
jimilian$ python3.5 serializators.py iterations= 100000 data= 'avzvasdklfjhaskldjfhkweljrqlkjb*@&$Y)(!#&$G@#lkjabfsdflb(*!G@#$(GKLJBmnz,bv(PGDFLKJ' ==== DUMP ==== Pickle: >> 0.09806302400829736 Json: 2.0.9 >> 0.12253901800431777 Marshal: 4 >> 0.09477431800041813 Msgpack: (0, 4, 7) >> 0.16701826300413813 ==== LOAD ==== Pickle: >> 0.10376790800364688 Json: 2.0.9 >> 0.30041573599737603 Marshal: 4 >> 0.034003349996055476 Msgpack: (0, 4, 7) >> 0.061493027009419166 jimilian$ python3.5 serializators.py iterations= 100000 data= [1,2,3]*100 ==== DUMP ==== Pickle: >> 0.9678693519963417 Json: 2.0.9 >> 4.494351467001252 Marshal: 4 >> 0.8597690019960282 Msgpack: (0, 4, 7) >> 1.2778299400088144 ==== LOAD ==== Pickle: >> 1.0350999219954247 Json: 2.0.9 >> 3.349724347004667 Marshal: 4 >> 0.468191737003508 Msgpack: (0, 4, 7) >> 0.3629750510008307 jimilian$ python2.7 serializators.py iterations= 100000 data= [1,2,3]*100 ==== DUMP ==== Pickle: >> 50.5894570351 Json: 2.0.9 >> 2.69190311432 cPickle: 1.71 >> 5.14689707756 Marshal: 2 >> 0.539206981659 Msgpack: (0, 4, 7) >> 0.752672195435 ==== LOAD ==== Pickle: >> 58.8052768707 Json: 2.0.9 >> 3.50090789795 cPickle: 1.71 >> 8.46298909187 Marshal: 2 >> 0.469168901443 Msgpack: (0, 4, 7) >> 0.315001010895
Pourquoi utiliseriez-vous
re code> pour analyser cela? Pourquoi êtes-vous préoccupé par la performance? Si vous êtes préoccupé par la performance, pourquoi vous attendez-vous à interpréter les données sauvegardées comme le goulot d'étranglement? Quelle est la nature de vos "résultats précédemment calculés"? Pourquoi ne stockeriez-vous pas un tuple avec, vous savez, plusieurs colonnes? Depuis quand les bases de données vous limitent-elles que des cordes seulement? Aucun de cela n'a de sens.
@Karlknechtel: Berkeley DB n'a pas de colonnes. C'est une base de données de grande valeur, l'une des nombreuses: Cabinet Tokyo / Kyoto, Memcached, Cassandra, Dynamo, Voldemort sont d'autres exemples.
@Karlknechtel J'utilise Berkeley dB donc je n'ai pas de colonnes multiples, si j'utilisais une autre base de données, alors je ne m'inquiéterais pas à ce sujet. Voir Stackoverflow.com / Questions / 2399643 / ...