Saltar al contenido

cursor.fetchall() vs list(cursor) en Python

Esta cuestión se puede tratar de variadas maneras, sin embargo te enseñamos la resolución más completa en nuestra opinión.

Solución:

Si está utilizando el cursor predeterminado, un MySQLdb.cursors.Cursor, todo el conjunto de resultados se almacenará en el lado del cliente (es decir, en una lista de Python) en el momento en que el cursor.execute() esta completado.

Por lo tanto, incluso si utiliza

for row in cursor:

no obtendrá ninguna reducción en el consumo de memoria. El conjunto de resultados completo ya se ha almacenado en una lista (Ver self._rows en MySQLdb/cursors.py).

Sin embargo, si usa un SSCursor o SSDictCursor:

import MySQLdb
import MySQLdb.cursors as cursors

conn = MySQLdb.connect(..., cursorclass=cursors.SSCursor)

luego el conjunto de resultados se almacena en el servidor, mysqld. Ahora puedes escribir

cursor = conn.cursor()
cursor.execute('SELECT * FROM HUGETABLE')
for row in cursor:
    print(row)

y las filas se obtendrán una por una desde el servidor, por lo que no será necesario que Python cree primero una enorme lista de tuplas y, por lo tanto, ahorrará memoria.

De lo contrario, como ya han dicho otros, cursor.fetchall() y list(cursor) son esencialmente los mismos.

cursor.fetchall() y list(cursor) son esencialmente los mismos. La opción diferente es no recuperar una lista y, en su lugar, simplemente recorrer el objeto del cursor desnudo:

for result in cursor:

Esto puede ser más eficiente si el conjunto de resultados es grande, ya que no tiene que obtener todo el conjunto de resultados y mantenerlo todo en la memoria; puede obtener cada elemento de forma incremental (o agruparlos en lotes más pequeños).

list(cursor) funciona porque un cursor es iterable; también puedes usar cursor en un bucle:

for row in cursor:
    # ...

Una buena implementación del adaptador de base de datos obtendrá filas en lotes del servidor, lo que ahorrará en la huella de memoria requerida, ya que no necesitará contener el completo conjunto de resultados en la memoria. cursor.fetchall()posee para devolver la lista completa en su lugar.

No tiene mucho sentido usar list(cursor) sobre cursor.fetchall(); el efecto final es entonces el mismo, pero desperdiciaste la oportunidad de transmitir los resultados.

Te mostramos comentarios y valoraciones

Recuerda que te permitimos añadir un enjuiciamiento si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *