This commit: 1. Formats all of our existing code using `black`. 2. Adds a note about using `black` to `CONTRIBUTING.rst`. 3. Runs `black --check` as part of CI (failing builds that aren't properly formatted).
143 lines
3.4 KiB
Python
143 lines
3.4 KiB
Python
from timeit import repeat
|
|
|
|
import mongoengine
|
|
from mongoengine import (
|
|
BooleanField,
|
|
Document,
|
|
EmailField,
|
|
EmbeddedDocument,
|
|
EmbeddedDocumentField,
|
|
IntField,
|
|
ListField,
|
|
StringField,
|
|
)
|
|
|
|
mongoengine.connect(db="mongoengine_benchmark_test")
|
|
|
|
|
|
def timeit(f, n=10000):
|
|
return min(repeat(f, repeat=3, number=n)) / float(n)
|
|
|
|
|
|
def test_basic():
|
|
class Book(Document):
|
|
name = StringField()
|
|
pages = IntField()
|
|
tags = ListField(StringField())
|
|
is_published = BooleanField()
|
|
author_email = EmailField()
|
|
|
|
Book.drop_collection()
|
|
|
|
def init_book():
|
|
return Book(
|
|
name="Always be closing",
|
|
pages=100,
|
|
tags=["self-help", "sales"],
|
|
is_published=True,
|
|
author_email="alec@example.com",
|
|
)
|
|
|
|
print("Doc initialization: %.3fus" % (timeit(init_book, 1000) * 10 ** 6))
|
|
|
|
b = init_book()
|
|
print("Doc getattr: %.3fus" % (timeit(lambda: b.name, 10000) * 10 ** 6))
|
|
|
|
print(
|
|
"Doc setattr: %.3fus"
|
|
% (timeit(lambda: setattr(b, "name", "New name"), 10000) * 10 ** 6)
|
|
)
|
|
|
|
print("Doc to mongo: %.3fus" % (timeit(b.to_mongo, 1000) * 10 ** 6))
|
|
|
|
print("Doc validation: %.3fus" % (timeit(b.validate, 1000) * 10 ** 6))
|
|
|
|
def save_book():
|
|
b._mark_as_changed("name")
|
|
b._mark_as_changed("tags")
|
|
b.save()
|
|
|
|
print("Save to database: %.3fus" % (timeit(save_book, 100) * 10 ** 6))
|
|
|
|
son = b.to_mongo()
|
|
print(
|
|
"Load from SON: %.3fus" % (timeit(lambda: Book._from_son(son), 1000) * 10 ** 6)
|
|
)
|
|
|
|
print(
|
|
"Load from database: %.3fus" % (timeit(lambda: Book.objects[0], 100) * 10 ** 6)
|
|
)
|
|
|
|
def create_and_delete_book():
|
|
b = init_book()
|
|
b.save()
|
|
b.delete()
|
|
|
|
print(
|
|
"Init + save to database + delete: %.3fms"
|
|
% (timeit(create_and_delete_book, 10) * 10 ** 3)
|
|
)
|
|
|
|
|
|
def test_big_doc():
|
|
class Contact(EmbeddedDocument):
|
|
name = StringField()
|
|
title = StringField()
|
|
address = StringField()
|
|
|
|
class Company(Document):
|
|
name = StringField()
|
|
contacts = ListField(EmbeddedDocumentField(Contact))
|
|
|
|
Company.drop_collection()
|
|
|
|
def init_company():
|
|
return Company(
|
|
name="MongoDB, Inc.",
|
|
contacts=[
|
|
Contact(name="Contact %d" % x, title="CEO", address="Address %d" % x)
|
|
for x in range(1000)
|
|
],
|
|
)
|
|
|
|
company = init_company()
|
|
print("Big doc to mongo: %.3fms" % (timeit(company.to_mongo, 100) * 10 ** 3))
|
|
|
|
print("Big doc validation: %.3fms" % (timeit(company.validate, 1000) * 10 ** 3))
|
|
|
|
company.save()
|
|
|
|
def save_company():
|
|
company._mark_as_changed("name")
|
|
company._mark_as_changed("contacts")
|
|
company.save()
|
|
|
|
print("Save to database: %.3fms" % (timeit(save_company, 100) * 10 ** 3))
|
|
|
|
son = company.to_mongo()
|
|
print(
|
|
"Load from SON: %.3fms"
|
|
% (timeit(lambda: Company._from_son(son), 100) * 10 ** 3)
|
|
)
|
|
|
|
print(
|
|
"Load from database: %.3fms"
|
|
% (timeit(lambda: Company.objects[0], 100) * 10 ** 3)
|
|
)
|
|
|
|
def create_and_delete_company():
|
|
c = init_company()
|
|
c.save()
|
|
c.delete()
|
|
|
|
print(
|
|
"Init + save to database + delete: %.3fms"
|
|
% (timeit(create_and_delete_company, 10) * 10 ** 3)
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
test_basic()
|
|
print("-" * 100)
|
|
test_big_doc()
|