En Python 2, ¿cuáles son las compensaciones de rendimiento para viewvalues ​​() / viewitems () sobre itervalues ​​() / iteritems ()?

Obviamente, el uso de values , items y keys es una mala práctica en Python 2.X en prácticamente todas las instancias, porque asignará una lista adicional que realmente no necesita. Por lo tanto, durante algún tiempo, la mejor práctica recomendada fue usar iteritems / itervalues , y usar el __iter__ si desea enumerar las claves del dict .

Con el backport de las keys , los values y los items de Python 3 a Python 2.7 como keys , values y items de viewitems , me pregunto cuáles son las viewitems y desventajas del desempeño real de la familia de funciones view* , y sus contrapartes iter* . ¿Es la única razón para continuar usando las funciones iter* las que se dirige a Python 2.6 y anteriores, o pueden los métodos iter* antiguos ser más rápidos que los métodos view* más nuevos en ciertos contextos?

Aquí hay una respuesta que trata iterkeys vs. viewkeys aquí: https://stackoverflow.com/a/10190228/344143

Resumen (con un poco de historia): los métodos de view* son una vista en vivo de los datos (que se actualizarán a medida que se actualicen), mientras que iter* y just-plain * parecen más a las instantáneas.

El respondedor vinculado sugiere que, si bien los métodos con sabor a view* también pueden tener una ventaja de rendimiento menor, puede haber problemas de compatibilidad con el puerto trasero, y recomienda continuar usando iter* / * en Python 2.

Mi opinión: si quieres una vista en vivo y estás en Python 2, usa view* ; si solo quiere pasar el conjunto de claves / valores / elementos una vez, use iter* ; Si desea aferrarse a una instantánea de k / v / i por un bit (o iterar de alguna manera no lineal), use * . Deja que el rendimiento se deslice hasta que lo recojas en un bucle interno.