From 023acab779033af2bb5389da4596dcb225e87e52 Mon Sep 17 00:00:00 2001 From: Stefan Wojcik Date: Thu, 13 Jun 2019 15:47:54 +0200 Subject: [PATCH] Clean up benchmark.py and move it to benchmarks/test_inserts.py 1. Removes the cascade=save tests. It's not an option I'd recommend using AND it primarily matters if you have any reference fields in your document, which is not the case in this script. 2. Uses PyMongo-v3.x-style write concern. 3. Removes an old docstring describing some random benchmark run from the past. 4. Removes unused parts of the code. I'll add more tests to the "benchmarks/" directory in future commits. --- benchmark.py | 207 ------------------------------------- benchmarks/test_inserts.py | 154 +++++++++++++++++++++++++++ 2 files changed, 154 insertions(+), 207 deletions(-) delete mode 100644 benchmark.py create mode 100644 benchmarks/test_inserts.py diff --git a/benchmark.py b/benchmark.py deleted file mode 100644 index 8e93ee40..00000000 --- a/benchmark.py +++ /dev/null @@ -1,207 +0,0 @@ -#!/usr/bin/env python - -""" -Simple benchmark comparing PyMongo and MongoEngine. - -Sample run on a mid 2015 MacBook Pro (commit b282511): - -Benchmarking... ----------------------------------------------------------------------------------------------------- -Creating 10000 dictionaries - Pymongo -2.58979988098 ----------------------------------------------------------------------------------------------------- -Creating 10000 dictionaries - Pymongo write_concern={"w": 0} -1.26657605171 ----------------------------------------------------------------------------------------------------- -Creating 10000 dictionaries - MongoEngine -8.4351580143 ----------------------------------------------------------------------------------------------------- -Creating 10000 dictionaries without continual assign - MongoEngine -7.20191693306 ----------------------------------------------------------------------------------------------------- -Creating 10000 dictionaries - MongoEngine - write_concern={"w": 0}, cascade = True -6.31104588509 ----------------------------------------------------------------------------------------------------- -Creating 10000 dictionaries - MongoEngine, write_concern={"w": 0}, validate=False, cascade=True -6.07083487511 ----------------------------------------------------------------------------------------------------- -Creating 10000 dictionaries - MongoEngine, write_concern={"w": 0}, validate=False -5.97704291344 ----------------------------------------------------------------------------------------------------- -Creating 10000 dictionaries - MongoEngine, force_insert=True, write_concern={"w": 0}, validate=False -5.9111430645 -""" - -import timeit - - -def main(): - print("Benchmarking...") - - setup = """ -from pymongo import MongoClient -connection = MongoClient() -connection.drop_database('timeit_test') -""" - - stmt = """ -from pymongo import MongoClient -connection = MongoClient() - -db = connection.timeit_test -noddy = db.noddy - -for i in range(10000): - example = {'fields': {}} - for j in range(20): - example['fields']['key' + str(j)] = 'value ' + str(j) - - noddy.save(example) - -myNoddys = noddy.find() -[n for n in myNoddys] # iterate -""" - - print("-" * 100) - print("""Creating 10000 dictionaries - Pymongo""") - t = timeit.Timer(stmt=stmt, setup=setup) - print(t.timeit(1)) - - stmt = """ -from pymongo import MongoClient -from pymongo.write_concern import WriteConcern -connection = MongoClient() - -db = connection.get_database('timeit_test', write_concern=WriteConcern(w=0)) -noddy = db.noddy - -for i in range(10000): - example = {'fields': {}} - for j in range(20): - example['fields']["key"+str(j)] = "value "+str(j) - - noddy.save(example) - -myNoddys = noddy.find() -[n for n in myNoddys] # iterate -""" - - print("-" * 100) - print("""Creating 10000 dictionaries - Pymongo write_concern={"w": 0}""") - t = timeit.Timer(stmt=stmt, setup=setup) - print(t.timeit(1)) - - setup = """ -from pymongo import MongoClient -connection = MongoClient() -connection.drop_database('timeit_test') -connection.close() - -from mongoengine import Document, DictField, connect -connect('timeit_test') - -class Noddy(Document): - fields = DictField() -""" - - stmt = """ -for i in range(10000): - noddy = Noddy() - for j in range(20): - noddy.fields["key"+str(j)] = "value "+str(j) - noddy.save() - -myNoddys = Noddy.objects() -[n for n in myNoddys] # iterate -""" - - print("-" * 100) - print("""Creating 10000 dictionaries - MongoEngine""") - t = timeit.Timer(stmt=stmt, setup=setup) - print(t.timeit(1)) - - stmt = """ -for i in range(10000): - noddy = Noddy() - fields = {} - for j in range(20): - fields["key"+str(j)] = "value "+str(j) - noddy.fields = fields - noddy.save() - -myNoddys = Noddy.objects() -[n for n in myNoddys] # iterate -""" - - print("-" * 100) - print("""Creating 10000 dictionaries without continual assign - MongoEngine""") - t = timeit.Timer(stmt=stmt, setup=setup) - print(t.timeit(1)) - - stmt = """ -for i in range(10000): - noddy = Noddy() - for j in range(20): - noddy.fields["key"+str(j)] = "value "+str(j) - noddy.save(write_concern={"w": 0}, cascade=True) - -myNoddys = Noddy.objects() -[n for n in myNoddys] # iterate -""" - - print("-" * 100) - print("""Creating 10000 dictionaries - MongoEngine - write_concern={"w": 0}, cascade = True""") - t = timeit.Timer(stmt=stmt, setup=setup) - print(t.timeit(1)) - - stmt = """ -for i in range(10000): - noddy = Noddy() - for j in range(20): - noddy.fields["key"+str(j)] = "value "+str(j) - noddy.save(write_concern={"w": 0}, validate=False, cascade=True) - -myNoddys = Noddy.objects() -[n for n in myNoddys] # iterate -""" - - print("-" * 100) - print("""Creating 10000 dictionaries - MongoEngine, write_concern={"w": 0}, validate=False, cascade=True""") - t = timeit.Timer(stmt=stmt, setup=setup) - print(t.timeit(1)) - - stmt = """ -for i in range(10000): - noddy = Noddy() - for j in range(20): - noddy.fields["key"+str(j)] = "value "+str(j) - noddy.save(validate=False, write_concern={"w": 0}) - -myNoddys = Noddy.objects() -[n for n in myNoddys] # iterate -""" - - print("-" * 100) - print("""Creating 10000 dictionaries - MongoEngine, write_concern={"w": 0}, validate=False""") - t = timeit.Timer(stmt=stmt, setup=setup) - print(t.timeit(1)) - - stmt = """ -for i in range(10000): - noddy = Noddy() - for j in range(20): - noddy.fields["key"+str(j)] = "value "+str(j) - noddy.save(force_insert=True, write_concern={"w": 0}, validate=False) - -myNoddys = Noddy.objects() -[n for n in myNoddys] # iterate -""" - - print("-" * 100) - print("""Creating 10000 dictionaries - MongoEngine, force_insert=True, write_concern={"w": 0}, validate=False""") - t = timeit.Timer(stmt=stmt, setup=setup) - print(t.timeit(1)) - - -if __name__ == "__main__": - main() diff --git a/benchmarks/test_inserts.py b/benchmarks/test_inserts.py new file mode 100644 index 00000000..29410ea5 --- /dev/null +++ b/benchmarks/test_inserts.py @@ -0,0 +1,154 @@ +import timeit + + +def main(): + setup = """ +from pymongo import MongoClient +connection = MongoClient() +connection.drop_database('timeit_test') +""" + + stmt = """ +from pymongo import MongoClient +connection = MongoClient() + +db = connection.timeit_test +noddy = db.noddy + +for i in xrange(10000): + example = {'fields': {}} + for j in range(20): + example['fields']["key"+str(j)] = "value "+str(j) + + noddy.insert_one(example) + +myNoddys = noddy.find() +[n for n in myNoddys] # iterate +""" + + print "-" * 100 + print """Creating 10000 dictionaries - PyMongo""" + t = timeit.Timer(stmt=stmt, setup=setup) + print '{}s'.format(t.timeit(1)) + + stmt = """ +from pymongo import MongoClient, WriteConcern +connection = MongoClient() + +db = connection.timeit_test +noddy = db.noddy.with_options(write_concern=WriteConcern(w=0)) + +for i in xrange(10000): + example = {'fields': {}} + for j in range(20): + example['fields']["key"+str(j)] = "value "+str(j) + + noddy.insert_one(example) + +myNoddys = noddy.find() +[n for n in myNoddys] # iterate +""" + + print "-" * 100 + print """Creating 10000 dictionaries - PyMongo write_concern={"w": 0}""" + t = timeit.Timer(stmt=stmt, setup=setup) + print '{}s'.format(t.timeit(1)) + + setup = """ +from pymongo import MongoClient +connection = MongoClient() +connection.drop_database('timeit_test') +connection.close() + +from mongoengine import Document, DictField, connect +connect("timeit_test") + +class Noddy(Document): + fields = DictField() +""" + + stmt = """ +for i in xrange(10000): + noddy = Noddy() + for j in range(20): + noddy.fields["key"+str(j)] = "value "+str(j) + noddy.save() + +myNoddys = Noddy.objects() +[n for n in myNoddys] # iterate +""" + + print "-" * 100 + print "Creating 10000 dictionaries - MongoEngine" + t = timeit.Timer(stmt=stmt, setup=setup) + print '{}s'.format(t.timeit(1)) + + stmt = """ +for i in xrange(10000): + noddy = Noddy() + fields = {} + for j in range(20): + fields["key"+str(j)] = "value "+str(j) + noddy.fields = fields + noddy.save() + +myNoddys = Noddy.objects() +[n for n in myNoddys] # iterate +""" + + print "-" * 100 + print "Creating 10000 dictionaries without continual assign - MongoEngine" + t = timeit.Timer(stmt=stmt, setup=setup) + print '{}s'.format(t.timeit(1)) + + stmt = """ +for i in xrange(10000): + noddy = Noddy() + for j in range(20): + noddy.fields["key"+str(j)] = "value "+str(j) + noddy.save(write_concern={"w": 0}) + +myNoddys = Noddy.objects() +[n for n in myNoddys] # iterate +""" + + print "-" * 100 + print """Creating 10000 dictionaries - MongoEngine - write_concern={"w": 0}""" + t = timeit.Timer(stmt=stmt, setup=setup) + print '{}s'.format(t.timeit(1)) + + stmt = """ +for i in xrange(10000): + noddy = Noddy() + for j in range(20): + noddy.fields["key"+str(j)] = "value "+str(j) + noddy.save(write_concern={"w": 0}, validate=False) + +myNoddys = Noddy.objects() +[n for n in myNoddys] # iterate +""" + + print "-" * 100 + print """Creating 10000 dictionaries - MongoEngine, write_concern={"w": 0}, validate=False""" + t = timeit.Timer(stmt=stmt, setup=setup) + print '{}s'.format(t.timeit(1)) + + stmt = """ +for i in xrange(10000): + noddy = Noddy() + for j in range(20): + noddy.fields["key"+str(j)] = "value "+str(j) + noddy.save(force_insert=True, write_concern={"w": 0}, validate=False) + +myNoddys = Noddy.objects() +[n for n in myNoddys] # iterate +""" + + print "-" * 100 + print """Creating 10000 dictionaries - MongoEngine, force_insert=True, write_concern={"w": 0}, validate=False""" + t = timeit.Timer(stmt=stmt, setup=setup) + print '{}s'.format(t.timeit(1)) + + +if __name__ == "__main__": + main()