Eu tenho um programa Python que funciona muito com dicionários. Tenho que fazer cópias de dicionários milhares de vezes. Preciso de uma cópia das chaves e do conteúdo associado. A cópia será editada e não deve ser vinculada ao original (por exemplo, as alterações na cópia não devem afetar o original).
As chaves são strings, os valores são inteiros (0/1).
Atualmente, uso uma maneira simples:
newDict = oldDict.copy()
A criação de perfil do meu código mostra que a operação de cópia leva a maior parte do tempo.
Existem alternativas mais rápidas para o dict.copy()
método? O que seria mais rápido?
python
performance
dictionary
copy
Joern
fonte
fonte
bool
escolha melhor do queint
?bool
em Python nomeado deint
qualquer maneira.bool
tipo é na verdade uma subclasse (subtipo?) Doint
tipo.Respostas:
Olhando o código-fonte C para as
dict
operações Python , você pode ver que eles fazem uma cópia bastante ingênua (mas eficiente). Essencialmente se resume a uma chamada paraPyDict_Merge
:Isso faz verificações rápidas de coisas como se eles são o mesmo objeto e se eles contêm objetos. Depois disso, ele faz um redimensionamento / alocação único generoso para o dicionário de destino e, em seguida, copia os elementos um por um. Não vejo você ficando muito mais rápido do que o embutido
copy()
.fonte
Aparentemente, o dict.copy é mais rápido, como você diz.
fonte
timeit
's-s
argumento:python -m timeit -s "from copy import copy" "new = copy({1:1, 2:2, 3:3})"
. Enquanto você faz isso, retire a criação do dicionário também (para todos os exemplos).Você pode fornecer um exemplo de código para que eu possa ver como você está usando copy () e em que contexto?
Você poderia usar
Mas não acho que será mais rápido.
fonte
Sei que esse é um tópico antigo, mas é um resultado alto em mecanismos de pesquisa para "dict copy python" e o resultado principal para "dict copy performance", e acredito que isso seja relevante.
Do Python 3.7,
newDict = oldDict.copy()
é até 5,5 vezes mais rápido do que era anteriormente. Notavelmente, agora,newDict = dict(oldDict)
não parece ter esse aumento de desempenho.Há um pouco mais de informações aqui .
fonte
Dependendo das coisas que você deixa para especulação, você pode embrulhar o dicionário original e fazer uma espécie de cópia na escrita.
A "cópia" é então um dicionário que procura coisas no dicionário "pai", se ainda não contém a chave --- mas armazena modificações em si mesmo.
Isso pressupõe que você não modificará o original e que as pesquisas extras não custarão mais.
fonte
No entanto, as medições dependem do tamanho do dicionário. Para 10.000 entradas, copy (d) e d.copy () são quase iguais.
fonte