Krótka odpowiedź brzmi, że operacje asynchroniczne zakłócają profilowanie.
Dokumentacja na bq.query
stwierdzić, że wynikowy google.cloud.bigquery.job.QueryJob
obiekt jest asynchroniczny zadanie zapytania. Oznacza to, że po przesłaniu zapytania interpreter Pythona nie blokuje się, dopóki nie spróbujesz użyć wyników zapytania z jednym z synchronicznych QueryJob
metody, to_dataframe()
. Znaczna część z 87 sekund, które widzisz, jest prawdopodobnie spędzona na oczekiwaniu na powrót zapytania.
Możesz poczekać na zakończenie zapytania, wywołując QueryJob.done
iteracyjnie, aż zwróci wartość true, a następnie wywołaj drugą instrukcję profilowania print.
Nie jest to do końca optymalizacja twojego kodu, ale miejmy nadzieję, że pomoże to we właściwym kierunku. Możliwe, że trochę dostrojenia podróży w obie strony może pomóc, ale myślę, że większość czasu spędzasz czekając na odczyt/zapis z baz danych i że pisanie wydajniejszego lub większej liczby mniejszych zapytań będzie twoim jedyna opcja do skrócenia całkowitego czasu.