From 3213eefa6244e2eaf92e748288756b93e0e774ec Mon Sep 17 00:00:00 2001 From: Alfred Santacatalina Date: Mon, 15 Sep 2014 22:10:55 +0200 Subject: [PATCH] Added performace test, BlobField and slots for models --- .env | 1 + dirty_models/base.py | 3 +++ dirty_models/fields.py | 4 ++++ performance/__init__.py | 32 ++++++++++++++++++++++++++++++++ performance/blobfield.py | 25 +++++++++++++++++++++++++ performance/dynamicmodel.py | 31 +++++++++++++++++++++++++++++++ performancerunner.py | 21 +++++++++++++++++++++ 7 files changed, 117 insertions(+) create mode 100644 .env create mode 100644 performance/__init__.py create mode 100644 performance/blobfield.py create mode 100644 performance/dynamicmodel.py create mode 100644 performancerunner.py diff --git a/.env b/.env new file mode 100644 index 0000000..2424425 --- /dev/null +++ b/.env @@ -0,0 +1 @@ +dirtymodels@0.3.6 diff --git a/dirty_models/base.py b/dirty_models/base.py index b5b8aaa..9f92ce4 100644 --- a/dirty_models/base.py +++ b/dirty_models/base.py @@ -11,6 +11,9 @@ class BaseData(): """ Base class for data inside dirty model """ + + __slots__ = [] + _locked = None _read_only = None _parent = None diff --git a/dirty_models/fields.py b/dirty_models/fields.py index 34088ad..0167cab 100644 --- a/dirty_models/fields.py +++ b/dirty_models/fields.py @@ -452,3 +452,7 @@ def __init__(self, model_class=None, **kwargs): def convert_value(self, value): return self._model_class(data=value, field_type=self.field_type) + + +class BlobField(BaseField): + pass diff --git a/performance/__init__.py b/performance/__init__.py new file mode 100644 index 0000000..a5b1d86 --- /dev/null +++ b/performance/__init__.py @@ -0,0 +1,32 @@ +from datetime import datetime, timedelta +from sys import setrecursionlimit +from functools import reduce + + +class Runner: + + def __init__(self, config): + self.config = config + + def run(self): + setrecursionlimit(9999999) + + result = {} + for label, data in self.config.items(): + test = data['test_class'](**data['params']) + test.prepare() + result_test = [] + print ('{0} start'.format(label)) + for i in range(data.get('repeats', 1)): + print ('{0}: iteration no. {1} start'.format(label, i)) + time_start = datetime.now() + test.run() + time_stop = datetime.now() + elapsed = time_stop - time_start + print ('{0}: iteration no. {1} => {2}'.format(label, i, str(elapsed))) + result_test.append(elapsed) + total = reduce(lambda acc, x: acc + x, result_test, timedelta()) + print ('{0} => {1}'.format(label, str(total))) + result[label] = {'results': result_test, 'total': total} + + return result diff --git a/performance/blobfield.py b/performance/blobfield.py new file mode 100644 index 0000000..5b1b799 --- /dev/null +++ b/performance/blobfield.py @@ -0,0 +1,25 @@ +''' +Created on 15/09/2014 + +:author: alfred +''' +from dirty_models.models import BaseModel +from dirty_models.fields import BlobField +from performance.dynamicmodel import create_dict + + +class FakeDynModel(BaseModel): + fake_data = BlobField() + + +class BlobFieldPerformance: + + def __init__(self, depth=5, children_count=5): + self.depth = depth + self.children_count = children_count + + def prepare(self): + self.data = create_dict(self.depth, self.children_count) + + def run(self): + return FakeDynModel(data={'fake_data': self.data}) diff --git a/performance/dynamicmodel.py b/performance/dynamicmodel.py new file mode 100644 index 0000000..aefeb18 --- /dev/null +++ b/performance/dynamicmodel.py @@ -0,0 +1,31 @@ +''' +Created on 15/09/2014 + +:author: alfred +''' +from dirty_models.models import DynamicModel, BaseModel +from dirty_models.fields import ModelField + + +def create_dict(depth=5, children_count=5): + if depth > 0: + return {'test_{0}'.format(i): create_dict(depth - 1, children_count) for i in range(children_count)} + else: + return 'top' + + +class FakeDynModel(BaseModel): + fake_data = ModelField(model_class=DynamicModel) + + +class DynamicModelPerformance: + + def __init__(self, depth=5, children_count=5): + self.depth = depth + self.children_count = children_count + + def prepare(self): + self.data = create_dict(self.depth, self.children_count) + + def run(self): + return FakeDynModel(data={'fake_data': self.data}) diff --git a/performancerunner.py b/performancerunner.py new file mode 100644 index 0000000..3c580fb --- /dev/null +++ b/performancerunner.py @@ -0,0 +1,21 @@ +''' +Created on 15/09/2014 + +:author: alfred +''' +from performance import Runner +from performance.dynamicmodel import DynamicModelPerformance +from performance.blobfield import BlobFieldPerformance + +config = {'DynamicModel': {'test_class': DynamicModelPerformance, + 'repeats': 5, + 'params': {'depth': 6, 'children_count': 6}}, + 'BlobField': {'test_class': BlobFieldPerformance, + 'repeats': 5, + 'params': {'depth': 6, 'children_count': 6}}} + +if __name__ == '__main__': + + runner = Runner(config) + + print(runner.run())