diff --git a/.gitignore b/.gitignore index 0bf8c4a7..38739d4f 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,6 @@ docs/_build/* # credentials and other uncheckinables host_settings.py + +# database of vbench +benchmarks.db diff --git a/etc/requirements_dev.txt b/etc/requirements_dev.txt index fe90268c..c131f4a5 100644 --- a/etc/requirements_dev.txt +++ b/etc/requirements_dev.txt @@ -23,13 +23,6 @@ Sphinx==1.1.2 Paver==1.0.5 Paved==0.3 -# Testing -nose==1.1.2 -coverage==3.5.1 -mock==0.7.2 -nosexcover==1.0.7 -pylint==0.25.1 - # pycco deps Markdown==2.1.1 Pycco==0.3.0 @@ -39,3 +32,4 @@ wsgiref==0.1.2 # misc pycleaner==1.1.1 +-e git://github.com/pydata/vbench.git#egg=vbench diff --git a/vb_suite/run_suite.py b/vb_suite/run_suite.py new file mode 100644 index 00000000..c9b397e1 --- /dev/null +++ b/vb_suite/run_suite.py @@ -0,0 +1,12 @@ +from vbench.api import BenchmarkRunner +from suite import * + +def run_process(): + runner = BenchmarkRunner(benchmarks, REPO_PATH, REPO_URL, + BUILD, DB_PATH, TMP_DIR, PREPARE, + run_option='all', start_date=START_DATE, + module_dependencies=dependencies) + runner.run() + +if __name__ == '__main__': + run_process() diff --git a/vb_suite/suite.py b/vb_suite/suite.py new file mode 100644 index 00000000..ed6c016d --- /dev/null +++ b/vb_suite/suite.py @@ -0,0 +1,111 @@ +from vbench.api import Benchmark, GitRepo +from datetime import datetime + +import os + +modules = ['ziplines'] + +by_module = {} +benchmarks = [] + +for modname in modules: + ref = __import__(modname) + by_module[modname] = [v for v in ref.__dict__.values() + if isinstance(v, Benchmark)] + benchmarks.extend(by_module[modname]) + +for bm in benchmarks: + assert(bm.name is not None) + +import getpass +import sys + +USERNAME = getpass.getuser() + +if sys.platform == 'darwin': + HOME = '/Users/%s' % USERNAME +else: + HOME = '/home/%s' % USERNAME + +REPO_PATH = os.path.join(HOME, 'projects/qexec/zipline_repo') +REPO_URL = 'git@github.com:quantopian/zipline.git' +DB_PATH = os.path.join(REPO_PATH, 'vb_suite/benchmarks.db') +TMP_DIR = os.path.join(HOME, 'tmp/vb_zipline') + +PREPARE = """ +""" +BUILD = """ +""" +dependencies = ['zipline_bench_functions.py'] + +START_DATE = datetime(2011, 6, 1) + +repo = GitRepo(REPO_PATH) + +RST_BASE = 'source' + +# HACK! + +#timespan = [datetime(2011, 1, 1), datetime(2012, 1, 1)] + +def generate_rst_files(benchmarks): + import matplotlib as mpl + mpl.use('Agg') + import matplotlib.pyplot as plt + + vb_path = os.path.join(RST_BASE, 'vbench') + fig_base_path = os.path.join(vb_path, 'figures') + + if not os.path.exists(vb_path): + print 'creating %s' % vb_path + os.makedirs(vb_path) + + if not os.path.exists(fig_base_path): + print 'creating %s' % fig_base_path + os.makedirs(fig_base_path) + + for bmk in benchmarks: + print 'Generating rst file for %s' % bmk.name + rst_path = os.path.join(RST_BASE, 'vbench/%s.txt' % bmk.name) + + fig_full_path = os.path.join(fig_base_path, '%s.png' % bmk.name) + + # make the figure + plt.figure(figsize=(10, 6)) + ax = plt.gca() + bmk.plot(DB_PATH, ax=ax) + + start, end = ax.get_xlim() + + plt.xlim([start - 30, end + 30]) + plt.savefig(fig_full_path, bbox_inches='tight') + plt.close('all') + + fig_rel_path = 'vbench/figures/%s.png' % bmk.name + rst_text = bmk.to_rst(image_path=fig_rel_path) + with open(rst_path, 'w') as f: + f.write(rst_text) + + with open(os.path.join(RST_BASE, 'index.rst'), 'w') as f: + print >> f, """ +Performance Benchmarks +====================== + +These historical benchmark graphs were produced with `vbench +`__. + +.. toctree:: + :hidden: + :maxdepth: 3 +""" + for modname, mod_bmks in sorted(by_module.items()): + print >> f, ' vb_%s' % modname + modpath = os.path.join(RST_BASE, 'vb_%s.rst' % modname) + with open(modpath, 'w') as mh: + header = '%s\n%s\n\n' % (modname, '=' * len(modname)) + print >> mh, header + + for bmk in mod_bmks: + print >> mh, bmk.name + print >> mh, '-' * len(bmk.name) + print >> mh, '.. include:: vbench/%s.txt\n' % bmk.name diff --git a/vb_suite/zipline_bench_functions.py b/vb_suite/zipline_bench_functions.py new file mode 100644 index 00000000..c970f055 --- /dev/null +++ b/vb_suite/zipline_bench_functions.py @@ -0,0 +1,43 @@ +try: + from zipline.simulator import AddressAllocator + pass +except Exception, e: + from zipline.core.devsimulator import AddressAllocator + +from zipline.lines import SimulatedTrading + +allocator = AddressAllocator(1001) + + +def get_zipline(): + zipline_test_config = { + 'allocator':allocator, + 'sid':133 + } + + zipline = SimulatedTrading.create_test_zipline( + **zipline_test_config + ) + + return zipline + +def run_basic_zipline(): + zipline = get_zipline() + zipline.simulate(blocking=True) + +def load_ndict(): + from zipline import ndict + nd = ndict({}) + keyname = 'a %i' + for i in xrange(1000000): + nd[keyname % i] = i + + for i in xrange(1000000): + nd[keyname % i] + +def mass_create_ndict(): + from zipline import ndict + data = dict(('a %d' % a,a) for a in xrange(1000)) + + for i in xrange(10000): + ndict(data) diff --git a/vb_suite/ziplines.py b/vb_suite/ziplines.py new file mode 100644 index 00000000..fd3fba0a --- /dev/null +++ b/vb_suite/ziplines.py @@ -0,0 +1,27 @@ +from vbench.api import Benchmark +from datetime import datetime + +setup = """ +from zipline_bench_functions import * +""" + +basic_zipline = Benchmark( + 'run_basic_zipline()', + setup=setup, + start_date=datetime(2012,5,15), + name='basic_zipline_test' +) + +load_ndict = Benchmark( + 'load_ndict()', + setup=setup, + start_date=datetime(2012,4,15), + name='load_ndict' +) + +mass_create_ndict = Benchmark( + 'mass_create_ndict()', + setup=setup, + start_date=datetime(2012,5,1), + name='create_ndict' +) diff --git a/zipline/finance/performance.py b/zipline/finance/performance.py index d72c229d..76231d2e 100644 --- a/zipline/finance/performance.py +++ b/zipline/finance/performance.py @@ -114,8 +114,6 @@ Performance Period import logging import datetime import pytz -import msgpack -import pandas import math import zmq diff --git a/zipline/utils/__init__.py b/zipline/utils/__init__.py index 8a1b7b26..1bdceb03 100644 --- a/zipline/utils/__init__.py +++ b/zipline/utils/__init__.py @@ -1,5 +1,4 @@ from protocol_utils import ndict - __all__ = [ ndict, ] diff --git a/zipline/utils/protocol_utils.py b/zipline/utils/protocol_utils.py index 376fc8c7..c0b7ad16 100644 --- a/zipline/utils/protocol_utils.py +++ b/zipline/utils/protocol_utils.py @@ -40,9 +40,14 @@ class ndict(MutableMapping): this time. """ + cls = None + __slots__ = ['cls', '__internal'] + def __init__(self, dct=None): self.__internal = dict() - self.cls = frozenset(dir(self)) + + if not ndict.cls: + ndict.cls = frozenset(dir(self)) if dct: self.__internal.update(dct) @@ -51,8 +56,8 @@ class ndict(MutableMapping): # ----------------- def __setattr__(self, key, value): - if '_ndict' in key or key == 'cls': - self.__dict__[key] = value + if key == 'cls' or key == '__internal' or '_ndict' in key: + super(ndict, self).__setattr__(key, value) else: self.__internal[key] = value return value @@ -68,7 +73,7 @@ class ndict(MutableMapping): def __getattr__(self, key): if key in self.cls: - return self.__dict__[key] + super(ndict, self).__getattr__(key) else: return self.__internal[key]