diff --git a/.landscape.yml b/.landscape.yml index 67792743..fb73e980 100644 --- a/.landscape.yml +++ b/.landscape.yml @@ -2,3 +2,6 @@ pylint: disable: # We use this a lot (e.g. via document._meta) - protected-access + +ignore-paths: + - benchmark.py diff --git a/benchmark.py b/benchmark.py index 06754fb0..8e93ee40 100644 --- a/benchmark.py +++ b/benchmark.py @@ -1,117 +1,41 @@ #!/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 cprofile_main(): - from pymongo import Connection - connection = Connection() - connection.drop_database('timeit_test') - connection.disconnect() - - from mongoengine import Document, DictField, connect - connect("timeit_test") - - class Noddy(Document): - fields = DictField() - - noddy = Noddy() - for j in range(20): - noddy.fields["key" + str(j)] = "value " + str(j) - noddy.save() - - def main(): - """ - 0.4 Performance Figures ... - - ---------------------------------------------------------------------------------------------------- - Creating 10000 dictionaries - Pymongo - 3.86744189262 - ---------------------------------------------------------------------------------------------------- - Creating 10000 dictionaries - MongoEngine - 6.23374891281 - ---------------------------------------------------------------------------------------------------- - Creating 10000 dictionaries - MongoEngine, safe=False, validate=False - 5.33027005196 - ---------------------------------------------------------------------------------------------------- - Creating 10000 dictionaries - MongoEngine, safe=False, validate=False, cascade=False - pass - No Cascade - - 0.5.X - ---------------------------------------------------------------------------------------------------- - Creating 10000 dictionaries - Pymongo - 3.89597702026 - ---------------------------------------------------------------------------------------------------- - Creating 10000 dictionaries - MongoEngine - 21.7735359669 - ---------------------------------------------------------------------------------------------------- - Creating 10000 dictionaries - MongoEngine, safe=False, validate=False - 19.8670389652 - ---------------------------------------------------------------------------------------------------- - Creating 10000 dictionaries - MongoEngine, safe=False, validate=False, cascade=False - pass - No Cascade - - 0.6.X - ---------------------------------------------------------------------------------------------------- - Creating 10000 dictionaries - Pymongo - 3.81559205055 - ---------------------------------------------------------------------------------------------------- - Creating 10000 dictionaries - MongoEngine - 10.0446798801 - ---------------------------------------------------------------------------------------------------- - Creating 10000 dictionaries - MongoEngine, safe=False, validate=False - 9.51354718208 - ---------------------------------------------------------------------------------------------------- - Creating 10000 dictionaries - MongoEngine, safe=False, validate=False, cascade=False - 9.02567505836 - ---------------------------------------------------------------------------------------------------- - Creating 10000 dictionaries - MongoEngine, force=True - 8.44933390617 - - 0.7.X - ---------------------------------------------------------------------------------------------------- - Creating 10000 dictionaries - Pymongo - 3.78801012039 - ---------------------------------------------------------------------------------------------------- - Creating 10000 dictionaries - MongoEngine - 9.73050498962 - ---------------------------------------------------------------------------------------------------- - Creating 10000 dictionaries - MongoEngine, safe=False, validate=False - 8.33456707001 - ---------------------------------------------------------------------------------------------------- - Creating 10000 dictionaries - MongoEngine, safe=False, validate=False, cascade=False - 8.37778115273 - ---------------------------------------------------------------------------------------------------- - Creating 10000 dictionaries - MongoEngine, force=True - 8.36906409264 - 0.8.X - ---------------------------------------------------------------------------------------------------- - Creating 10000 dictionaries - Pymongo - 3.69964408875 - ---------------------------------------------------------------------------------------------------- - Creating 10000 dictionaries - Pymongo write_concern={"w": 0} - 3.5526599884 - ---------------------------------------------------------------------------------------------------- - Creating 10000 dictionaries - MongoEngine - 7.00959801674 - ---------------------------------------------------------------------------------------------------- - Creating 10000 dictionaries without continual assign - MongoEngine - 5.60943293571 - ---------------------------------------------------------------------------------------------------- - Creating 10000 dictionaries - MongoEngine - write_concern={"w": 0}, cascade=True - 6.715102911 - ---------------------------------------------------------------------------------------------------- - Creating 10000 dictionaries - MongoEngine, write_concern={"w": 0}, validate=False, cascade=True - 5.50644683838 - ---------------------------------------------------------------------------------------------------- - Creating 10000 dictionaries - MongoEngine, write_concern={"w": 0}, validate=False - 4.69851183891 - ---------------------------------------------------------------------------------------------------- - Creating 10000 dictionaries - MongoEngine, force_insert=True, write_concern={"w": 0}, validate=False - 4.68946313858 - ---------------------------------------------------------------------------------------------------- - """ print("Benchmarking...") setup = """ @@ -130,7 +54,7 @@ noddy = db.noddy for i in range(10000): example = {'fields': {}} for j in range(20): - example['fields']["key"+str(j)] = "value "+str(j) + example['fields']['key' + str(j)] = 'value ' + str(j) noddy.save(example) @@ -145,9 +69,10 @@ myNoddys = noddy.find() stmt = """ from pymongo import MongoClient +from pymongo.write_concern import WriteConcern connection = MongoClient() -db = connection.timeit_test +db = connection.get_database('timeit_test', write_concern=WriteConcern(w=0)) noddy = db.noddy for i in range(10000): @@ -155,7 +80,7 @@ for i in range(10000): for j in range(20): example['fields']["key"+str(j)] = "value "+str(j) - noddy.save(example, write_concern={"w": 0}) + noddy.save(example) myNoddys = noddy.find() [n for n in myNoddys] # iterate @@ -170,10 +95,10 @@ myNoddys = noddy.find() from pymongo import MongoClient connection = MongoClient() connection.drop_database('timeit_test') -connection.disconnect() +connection.close() from mongoengine import Document, DictField, connect -connect("timeit_test") +connect('timeit_test') class Noddy(Document): fields = DictField() diff --git a/mongoengine/python_support.py b/mongoengine/python_support.py index 64205c3d..154bafb3 100644 --- a/mongoengine/python_support.py +++ b/mongoengine/python_support.py @@ -2,7 +2,6 @@ Helper functions, constants, and types to aid with Python v2.6 - v3.x and PyMongo v2.7 - v3.x support. """ -import sys import pymongo import six