La réponse courte est que les opérations asynchrones brouillent votre profilage.
Les docs sur bq.query
indiquez que le résultat google.cloud.bigquery.job.QueryJob
l'objet est asynchrone tâche de requête. Cela signifie qu'une fois la requête soumise, l'interpréteur Python ne se bloque pas tant que vous n'essayez pas d'utiliser les résultats de la requête avec l'un des QueryJob
synchrones. méthodes, to_dataframe()
. Une part importante des 87 secondes que vous voyez est probablement consacrée à l'attente du retour de la requête.
Vous pouvez attendre que la requête soit terminée en appelant QueryJob.done
itérativement jusqu'à ce qu'il renvoie true, puis appelez votre 2e instruction d'impression de profilage.
Ce n'est pas tout à fait une optimisation de votre code, mais j'espère que cela vous aidera à aller dans la bonne direction. Il est possible qu'un réglage de l'aller-retour des pandas puisse aider, mais je pense qu'il est probable que la plupart de votre temps soit passé à attendre la lecture/écriture de vos bases de données, et que l'écriture plus efficace ou un plus grand nombre de petites requêtes va être votre seule option pour réduire le temps total.