Краткият отговор е, че асинхронните операции замъгляват вашето профилиране.
Документите на bq.query
посочва, че полученият google.cloud.bigquery.job.QueryJob
обектът е асинхронен заявка работа. Това означава, че след подаване на заявката интерпретаторът на Python не блокира, докато не опитате да използвате резултатите от заявката с един от синхронните QueryJob
методи, to_dataframe()
. Значителна част от 87-те секунди, които виждате, вероятно просто са прекарани в чакане заявката да се върне.
Можете да изчакате заявката да приключи, като извикате QueryJob.done
итеративно, докато върне true, след това извикайте вашия 2-ри профилиращ израз за печат.
Това не е съвсем оптимизация на вашия код, но се надяваме, че помага да се движите в правилната посока. Възможно е някаква настройка на pandas turntrip да помогне, но мисля, че е вероятно по-голямата част от времето ви да прекарвате в чакане за четене/запис от вашите бази данни и писането на по-ефективно или по-голям брой по-малки заявки ще бъде вашето единствената опция за съкращаване на общото време.