Det korte svar er, at asynkrone operationer forvirrer din profilering.
Dokumenterne på bq.query
angive, at den resulterende google.cloud.bigquery.job.QueryJob
objekt er et asynkront forespørgselsjob. Det betyder, at efter at forespørgslen er sendt, blokerer python-fortolkeren ikke, før du forsøger at bruge resultaterne af forespørgslen med en af de synkrone QueryJob
metoder, to_dataframe()
. En betydelig del af de 87 sekunder, du ser, bliver sandsynligvis bare brugt på at vente på, at forespørgslen vender tilbage.
Du kan vente på, at forespørgslen er færdig ved at ringe til QueryJob.done
iterativt, indtil det returnerer sandt, ring derefter din 2. profiludskriftserklæring.
Dette er ikke helt en optimering af din kode, men hjælper forhåbentlig i den rigtige retning. Det er muligt, at nogle justeringer af pandaerne rundtur kan hjælpe, men jeg tror, det er sandsynligt, at det meste af din tid bliver brugt på at vente på læsning/skrivning fra dine databaser, og at skrivning af mere effektiv eller et større antal mindre forespørgsler vil være din eneste mulighed for at reducere den samlede tid.