8
votes

Python: comparaison de performance de l'utilisation de `cornichons` ou` marshal` et d'utiliser `re`

Je calcule des nombres très gros utilisant Python, et j'aimerais stocker des résultats précédemment calculés à Berkeley DB.

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.

Par exemple, je reçois (m, n) comme mon résultat, une solution consiste à stocker cela comme "% d,% d"% (m, n) et lisez-le en utilisant re . Je peux également stocker le tuple en utilisant cornichon ou maréchal .

qui a la meilleure performance?


3 commentaires

Pourquoi utiliseriez-vous re 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 / ...


4 Réponses :


3
votes

TEMPS TIME ET CONSULTER!

Je m'attendrais à ce que CPickle soit le plus rapide, mais ce n'est pas une garantie.


1 commentaires

Notez que l'OP ne mentionne pas une version Python, et cpickle n'existe pas séparément de Pickle dans py3 - cornichon fournira l'optimisation La version de celui-ci existe et retombe à la version pure-Python autrement.



12
votes

pour la vitesse pure, maréchal vous obtiendra les résultats les plus rapides.

horaires: xxx


4 commentaires

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.



1
votes

Check out étagère , une simple boutique de valeur de clé persistante avec un dictionnaire - API qui utilise cornichon pour sérialiser des objets.


0 commentaires

7
votes

Quand quelqu'un pense à la performance, il devrait se souvenir de 3 choses:

  • Ne faites confiance à personne - Toute référence peut mentir (par une autre raison: non professionnelle, marketing, etc.) li>
  • Mesurez toujours votre cas - par exemple, le système de cache et les statistiques ont des exigences totalement différentes. Dans un cas, vous devez lire aussi vite que possible, dans d'autres cas - écrire li>
  • Répétez les tests - La nouvelle version de tout logiciel pourrait être plus rapide / plus lente, de sorte que toute mise à jour puisse introduire des avantages / pénalités li> ul>

    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
    


0 commentaires