From fe5a2a888a498d838c3cc43de2c33ac08b20d2a7 Mon Sep 17 00:00:00 2001 From: Jean Bredeche Date: Mon, 9 May 2016 10:18:41 -0400 Subject: [PATCH] PERF: takes ~14% off the time it takes to initialize a MinuteSimulationClock on my machine, ~350ms -> ~300ms also, clarifies the public API for MinuteSimulationClock (now, only __iter__ is exposed) --- zipline/algorithm.py | 1 - zipline/gens/sim_engine.pyx | 18 ++++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/zipline/algorithm.py b/zipline/algorithm.py index 9b0026ce..76b40bba 100644 --- a/zipline/algorithm.py +++ b/zipline/algorithm.py @@ -478,7 +478,6 @@ class TradingAlgorithm(object): self.sim_params.trading_days, market_opens, market_closes, - env.trading_days, minutely_emission ) return clock diff --git a/zipline/gens/sim_engine.pyx b/zipline/gens/sim_engine.pyx index abc7d8b1..02d0472c 100644 --- a/zipline/gens/sim_engine.pyx +++ b/zipline/gens/sim_engine.pyx @@ -30,7 +30,6 @@ cpdef enum: cdef class MinuteSimulationClock: cdef object trading_days - cdef object all_trading_days cdef bool minute_emission cdef np.int64_t[:] market_opens, market_closes cdef public dict minutes_by_day, minutes_to_day @@ -39,19 +38,18 @@ cdef class MinuteSimulationClock: trading_days, market_opens, market_closes, - all_trading_days, minute_emission=False): self.minute_emission = minute_emission self.market_opens = market_opens self.market_closes = market_closes self.trading_days = trading_days - self.all_trading_days = all_trading_days self.minutes_by_day = self.calc_minutes_by_day() @cython.boundscheck(False) @cython.wraparound(False) - cpdef market_minutes(self, np.intp_t i): + cdef np.ndarray[np.int64_t, ndim=1] market_minutes(self, np.intp_t i): cdef np.int64_t[:] market_opens, market_closes + market_opens = self.market_opens market_closes = self.market_closes @@ -59,16 +57,20 @@ cdef class MinuteSimulationClock: market_closes[i] + _nanos_in_minute, _nanos_in_minute) - cpdef calc_minutes_by_day(self): + @cython.boundscheck(False) + @cython.wraparound(False) + cdef dict calc_minutes_by_day(self): + cdef dict minutes_by_day + cdef int day_idx + cdef object day + minutes_by_day = {} for day_idx, day in enumerate(self.trading_days): - minutes = pd.to_datetime( + minutes_by_day[day] = pd.to_datetime( self.market_minutes(day_idx), utc=True, box=True) - minutes_by_day[day] = minutes return minutes_by_day def __iter__(self): - minute_emission = self.minute_emission for day in self.trading_days: