Вообще говоря, это не очень хороший пример, поскольку вы пишете только один документ. Задержка написания этого единственного документа может составлять 3000 мс, а следующий теоретически может составлять 1 мс. Разработайте тест, который записывает несколько документов и принимает среднее время этих записей. Также имейте в виду, что написание последовательных документов приведет к снижению производительности, если идентификаторы документов являются приличными. Вот почему вы должны выбрать случайный идентификатор документа или ха sh некоторого вида.
import uuid
from google.cloud import firestore_v1
count = 20
data = [{f"test_field_{i}":f"test_value_{i}"} for i in range(count)]
now = time.time()
db = firestore_v1.Client()
coll = db.collection(u'latency_test_collection').
for record in data:
coll.document(uuid.uuid4().hex).set(record)
print(f"Average time: {(time.time() - now)/count)}")
Но имейте в виду, что при записи большого количества отдельных записей / документов в хранилище вы все еще ограничены по скорости пожарного магазина api. Есть два способа преодолеть это. Первый пишет документы асинхронно. Таким образом, вы можете обрабатывать несколько записей одновременно, но это может быть очень дорого, так как вы платите за каждый вызов API в Firestore. Другой (предпочтительный) способ написания нескольких записей / документов - выполнение пакетных операций, это показано ниже. Имейте в виду, что максимальный размер пакета для записи составляет 500 во время записи.
import uuid
from google.cloud import firestore_v1
count = 20
data = [{f"test_field_{i}":f"test_value_{i}"} for i in range(count)]
now = time.time()
db = firestore_v1.Client()
coll = db.collection(u'latency_test_collection').
batch = db.batch()
for idx, record in enumerate(data):
doc_ref = coll.document(uuid.uuid4().hex)
batch.set(doc_ref, record)
# Max batch size is 500
if idx % 500 == 0:
batch.commit()
if idx % 500 != 0
batch.commit()
print(f"Total time: {(time.time() - now)/count)}")