2 votes

Problème de performance de Python

J'ai les données comme ci-dessous

print(json_ls)

[{'user_id': '1', 'lot_number': 'b49d18f1b', 'status': 'send'}, 
 {'user_id': '2', 'lot_number': 'b49d18f1c', 'status': 'send'},
 {'user_id': '3', 'lot_number': 'b49d18f1d', 'status': 'send'},
 {'user_id': '4', 'lot_number': 'b49d18f1e', 'status': 'send'}]

Et j'ai besoin d'envoyer les données ci-dessus à l'API dans le format ci-dessous.

{'users': [

{'user_id': '1',  'status': 'ready'}, 
 {'user_id': '2',  'status': 'ready'},
 {'user_id': '3',  'status': 'ready'},
 {'user_id': '4',  'status': 'ready'}

]} 

J'ai écrit le code ci-dessous, puisque le numéro de lot est nécessaire pour l'url, j'ai d'abord considéré que dans le cadre de données et de la baisse dans le code ci-dessous.

final_data = {'users': []}                                              

  for ls in json_ls:
    lot = ls.get("lot_number")
    url = url + lotnumber                                                  
    request_data = {a: b for (a, b) in ls.items() if a != "lot_number"}     
    final_data['users'].append(request_data)

    for users in final_data.get("recipients"):                              
           users["status"] = "ready"
    response = requests.patch(url, data=json.dumps(final_data), headers=headers)

Pour traiter 500 utilisateurs vers l'API, cela a pris 15 minutes et le statut de tous les utilisateurs n'a pas été changé en "prêt". Pour chaque utilisateur, le statut devrait être envoyé avec le statut "prêt".

Quelqu'un peut-il m'aider sur ce point et aussi comment améliorer les performances de la partie codage (j'ai commenté la réponse et vérifié le temps d'exécution). C'est plus rapide et il semble que l'API elle-même prenne du temps pour répondre à chaque utilisateur).

Merci pour votre aide.

0voto

Sayse Points 9275

Je soupçonne que vos problèmes de performance viennent de l'envoi de données incorrectes, vos données finales incluent toujours les utilisateurs des itérations précédentes, donc vous ne mettez pas à jour 500 utilisateurs, vous mettez à jour 1 + 2 + .... + 500 utilisateurs (125k utilisateurs) ...

En réalité, vous n'avez pas du tout besoin de données finales.

for ls in json_ls:
    lot = ls.get("lot_number")
    url = url + lotnumber                                                
    response = requests.patch(url, data=json.dumps({'users': [ {'user_id':ls['user_id'], 'status': 'ready'}]}), headers=headers)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X