Tengo una estructura en árbol de widgets, p. la colección contiene modelos y el modelo contiene widgets. Quiero copiar la colección entera, copy.deepcopy
es más rápido en comparación con 'pepinillo y de-pickle'ing el objeto sino cPickle como escrito en C es mucho más rápido, por locopy.deepcopy vs pickle
- ¿Por qué no yo (nosotros) siempre estar usando cPickle en lugar de deepcopy?
- ¿Hay alguna otra alternativa de copia? porque la salmuera es más lento que DeepCopy pero cPickle es más rápido, por lo que puede ser una aplicación C de deepcopy será el ganador
código de prueba de la muestra:
import copy
import pickle
import cPickle
class A(object): pass
d = {}
for i in range(1000):
d[i] = A()
def copy1():
return copy.deepcopy(d)
def copy2():
return pickle.loads(pickle.dumps(d, -1))
def copy3():
return cPickle.loads(cPickle.dumps(d, -1))
Tiempos:
>python -m timeit -s "import c" "c.copy1()"
10 loops, best of 3: 46.3 msec per loop
>python -m timeit -s "import c" "c.copy2()"
10 loops, best of 3: 93.3 msec per loop
>python -m timeit -s "import c" "c.copy3()"
100 loops, best of 3: 17.1 msec per loop
Esta es una observación muy útil. – bayer
hm, ¿no debería estar comparando 'pickle' con' copy.copy'? – SilentGhost
¿Depende en absoluto de la estructura de lo que está copiando? Como en, ¿hace una diferencia si, por ejemplo, la memoria asignada a los objetos copiados no es contigua o los punteros subyacentes tienen una larga cadena a seguir? –