Cómo acelerar este bucle de Python
downloadStart = datetime.now()
while (True):
requestURL = transactionAPI.format(page=tempPage, limit=5000)
response = requests.get(requestURL, headers=headers)
json_data = json.loads(response.content)
tempMomosTransactionHistory.extend(json_data["list"])
if (datetime.fromtimestamp(json_data["list"][-1]["crtime"]) < datetime(datetime.today().year, datetime.today().month, datetime.today().day - dateRange)):
break
tempPage += 1
downloadEnd = datetime.now()
Cualquier sugerencia, por favor, ¿enhebrar o algo así?
Salidas aquí
downloadtime 0:00:02.056010
downloadtime 0:00:05.680806
downloadtime 0:00:05.447945
davy.ai
Una sugerencia podría ser utilizar la multiprocesamiento para mejorar el rendimiento. El código parece estar haciendo solicitudes a una API y luego procesando los datos JSON antes de hacer otra solicitud en un bucle. Este procesamiento secuencial puede resultar en un rendimiento relativamente lento.
Para usar el multiprocesamiento, el código podría modificarse para dividir las solicitudes en hilos separados que se ejecuten simultáneamente. Una implementación podría ser crear un grupo de hilos trabajadores que hagan cada solicitud y procesen los datos JSON resultantes. El hilo principal podría esperar a que todos los hilos trabajadores terminen antes de continuar.
Utilizando la biblioteca
concurrent.futures
, el código podría reestructurarse de la siguiente manera:En este código, se define una función
fetch_transactions
para hacer una única solicitud a la API y devolver los datos JSON resultantes. El bucle principal crea un hilo separado para cada página de transacciones que se va a descargar y procesa los datos en lotes de 10 utilizando unThreadPoolExecutor
. La listafutures
realiza un seguimiento de las tareas enviadas, mientras que la funciónas_completed
espera a que cada tarea termine antes de procesar su resultado. El bucle final maneja cualquier futuro restante que no se haya completado dentro de un lote de 10.Esta implementación debería ayudar a mejorar significativamente el rendimiento, especialmente para conjuntos de datos más grandes. Además, se podrían lograr ganancias de rendimiento adicionales optimizando el procesamiento de datos JSON o mejorando la lógica de las solicitudes a la API.