es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , , ,

Answer

  1. Avatar for 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:

    import concurrent.futures
    
    def fetch_transactions(tempPage):
        requestURL = transactionAPI.format(page=tempPage, limit=5000)
        response = requests.get(requestURL, headers=headers)
        json_data = json.loads(response.content)
        return json_data["list"]
    
    downloadStart = datetime.now()
    tempMomosTransactionHistory = []
    
    with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
        futures = []
        tempPage = 1
        while True:
            futures.append(executor.submit(fetch_transactions, tempPage))
            tempPage += 1
            if len(futures) == 10:
                for future in concurrent.futures.as_completed(futures):
                    tempMomosTransactionHistory.extend(future.result()["list"])
                futures.clear()
            if datetime.fromtimestamp(json_data["list"][-1]["crtime"]) < datetime(datetime.today().year, datetime.today().month, datetime.today().day - dateRange):          
                break
        for future in concurrent.futures.as_completed(futures):
            tempMomosTransactionHistory.extend(future.result()["list"])
    
    downloadEnd = datetime.now()
    

    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 un ThreadPoolExecutor. La lista futures realiza un seguimiento de las tareas enviadas, mientras que la función as_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.

Comments are closed.