%python -m timeit -s "import copy" "x = (1, 2, 3)" "copy.deepcopy(x)"
100000 loops, best of 3: 10.1 usec per loop
%python -m timeit -s "import copy" "x = (1, 2, 3)" "copy.copy(x)"
1000000 loops, best of 3: 0.609 usec per loop
Perché deepcopy
15 volte più lento di copy
?copy.copy vs prestazioni copy.deepcopy su tuple
Ogni funzione deve scorrere tra gli elementi della tupla. Durante questa iterazione, copy
crea un altro riferimento a ciascun elemento; deepcopy
deepcopies ogni elemento.
Ma ogni elemento è un int
e deepcopying un int
crea semplicemente un altro riferimento ad esso. In altre parole, le due funzioni sembrano eseguire esattamente gli stessi passaggi, lo stesso numero di volte.
Ecco la verifica che nessuna nuova istanze vengono create nel processo:
ActivePython 3.2.1.2 (ActiveState Software Inc.) based on
Python 3.2.1 (default, Jul 18 2011, 14:31:09) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> x = (1,2,3)
>>> import copy
>>> y = copy.copy(x)
>>> z = copy.deepcopy(x)
>>> x is y
True
>>> x is z
True
>>> x[1] is z[1]
True
Non una vera risposta, ma un sospetto: 'deepcopy' ha bisogno di tenere traccia quali elementi si è già copiato per consentire i riferimenti ciclici, che potrebbe aggiungere un po 'in testa, soprattutto in questi casi semplici. – Philipp
Se riesci a stampare la tua copia di "deepcopy", potrebbe valerne la pena. Stavo profilando un codice di algoritmo evolutivo e passavo molto tempo in deepcopy. Sono stato in grado di determinare i vincoli necessari per l'algoritmo e scrivere la mia versione limitata di deepcopy che ha portato ad una sostanziale accelerazione. Il tuo chilometraggio può variare. – Levon