Det korta svaret är att asynkrona operationer grumlar din profilering.
Dokumenten på bq.query
ange att den resulterande google.cloud.bigquery.job.QueryJob
objekt är ett asynkront fråga jobb. Detta innebär att efter att frågan har skickats blockeras inte pythontolken förrän du försöker använda resultatet av frågan med en av de synkrona QueryJob
metoder, to_dataframe()
. En betydande del av de 87 sekunderna du ser ägnas sannolikt bara åt att vänta på att frågan ska återkomma.
Du kan vänta tills frågan är klar genom att ringa QueryJob.done
iterativt tills det returnerar sant, ring sedan ditt andra utskriftsutdrag för profilering.
Detta är inte riktigt en optimering av din kod, men förhoppningsvis hjälper det att gå i rätt riktning. Det är möjligt att en viss justering av pandorna tur och retur kan hjälpa, men jag tror att det är troligt att det mesta av din tid går åt till att vänta på att läsa/skriva från dina databaser, och att skriva mer effektivt eller ett större antal mindre frågor kommer att vara din enda alternativet för att minska den totala tiden.