J'ai un programme Python qui fonctionne beaucoup avec des dictionnaires. Je dois faire des copies de dictionnaires des milliers de fois. J'ai besoin d'une copie des clés et du contenu associé. La copie sera éditée et ne doit pas être liée à l'original (par exemple, les modifications apportées à la copie ne doivent pas affecter l'original.)
Les clés sont des chaînes, les valeurs sont des nombres entiers (0/1).
J'utilise actuellement un moyen simple:
newDict = oldDict.copy()
Le profilage de mon code montre que l'opération de copie prend la plupart du temps.
Existe-t-il des alternatives plus rapides à la dict.copy()
méthode? Quel serait le plus rapide?
python
performance
dictionary
copy
Joern
la source
la source
bool
serait un meilleur choix que anint
?bool
nommé en Pythonint
.bool
type est en fait une sous-classe (sous-type?) Duint
type.Réponses:
En regardant la source C pour les
dict
opérations Python , vous pouvez voir qu'elles font une copie assez naïve (mais efficace). Cela se résume essentiellement à un appel àPyDict_Merge
:Cela vérifie rapidement des choses comme s'il s'agit du même objet et s'ils contiennent des objets. Après cela, il effectue un redimensionnement / allocation unique généreux au dict cible, puis copie les éléments un par un. Je ne vous vois pas devenir beaucoup plus rapide que le système intégré
copy()
.la source
Apparemment, dict.copy est plus rapide, comme vous le dites.
la source
timeit
de »-s
argument:python -m timeit -s "from copy import copy" "new = copy({1:1, 2:2, 3:3})"
. Pendant que vous y êtes, retirez également la création de dict (pour tous les exemples.)Pouvez-vous fournir un exemple de code afin que je puisse voir comment vous utilisez copy () et dans quel contexte?
Vous pourriez utiliser
Mais je ne pense pas que ce sera plus rapide.
la source
Je me rends compte que c'est un vieux fil, mais c'est un résultat élevé dans les moteurs de recherche pour "dict copy python", et le meilleur résultat pour "dict copy performance", et je pense que c'est pertinent.
Depuis Python 3.7, il
newDict = oldDict.copy()
est jusqu'à 5,5 fois plus rapide qu'auparavant. Notamment, en ce moment,newDict = dict(oldDict)
ne semble pas avoir cette augmentation des performances.Il y a un peu plus d'informations ici .
la source
Selon ce que vous laissez à la spéculation, vous voudrez peut-être envelopper le dictionnaire original et faire une sorte de copie sur écriture.
La "copie" est alors un dictionnaire qui recherche des trucs dans le dictionnaire "parent", s'il ne contient pas déjà la clé --- mais bourre les modifications en lui-même.
Cela suppose que vous ne modifierez pas l'original et que les recherches supplémentaires ne coûteront pas plus cher.
la source
Les mesures dépendent cependant de la taille du dictionnaire. Pour 10000 entrées, copy (d) et d.copy () sont presque identiques.
la source