Leí en un comentario aquí en Stack Overflow que es más eficiente en la memoria hacer la asignación de división cuando se cambian las listas. Por ejemplo,Python Slice Assignment Memory Usage
a[:] = [i + 6 for i in a]
debe ser más eficiente de la memoria de
a = [i + 6 for i in a]
porque el primero sustituye a los elementos de la lista existente, mientras que el segundo crea una nueva lista y vuelve a enlazar a
a la nueva lista, dejando el viejo a
en la memoria hasta que pueda ser basura recolectada. Evaluación comparativa de los dos para la velocidad, éste es un poco más rápido:
$ python -mtimeit -s 'a = [1, 2, 3]' 'a[:] = [i + 6 for i in a]'
1000000 loops, best of 3: 1.53 usec per loop
$ python -mtimeit -s 'a = [1, 2, 3]' 'a = [i + 6 for i in a]'
1000000 loops, best of 3: 1.37 usec per loop
Eso es lo que cabe esperar, como revinculación de una variable debe ser más rápido que la sustitución de los elementos en una lista. Sin embargo, no puedo encontrar ninguna documentación oficial que respalde el reclamo de uso de memoria, y no estoy seguro de cómo compararlo.
A primera vista, el reclamo de uso de memoria tiene sentido para mí. Sin embargo, pensándolo mejor, esperaría que en el método anterior, el intérprete creara una nueva lista de la lista comprensiva y luego copiara los valores de esa lista a a
, dejando la lista anónima flotando hasta que es basura recolectada Si ese es el caso, entonces el método anterior usaría la misma cantidad de memoria y también sería más lento.
¿Alguien puede mostrar definitivamente (con un punto de referencia o documentación oficial) cuál de los dos métodos es más eficiente con la memoria/cuál es el método preferido?
Gracias de antemano.
Merece la pena considerar los aspectos de rendimiento, pero creo que es más probable que te topes con el caso práctico (en programas más grandes) donde pasas una referencia a una lista, por ejemplo, de Class1 a Class2. En la primera instancia, usar la asignación de división para modificar la lista de Class1 conservará la referencia de Class2. En la segunda instancia que cita, la modificación de la lista de Class1 significa que Class2 tendrá una referencia a una lista que ya no es válida. – Brandon
@Brandon: Eso también es cierto, y probablemente debería haber mencionado la distinción en mi pregunta. Gracias por tu contribución. –