From 6cbe0d8aef93bbd8be02e42b2959b4d6ece625ba Mon Sep 17 00:00:00 2001 From: Guillaume Horel Date: Fri, 12 May 2017 10:34:09 -0400 Subject: small speedups and bugfix --- pyisda/curve.pyx | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/pyisda/curve.pyx b/pyisda/curve.pyx index 3f9ece2..a9528f7 100644 --- a/pyisda/curve.pyx +++ b/pyisda/curve.pyx @@ -260,7 +260,7 @@ cdef class YieldCurve(Curve): def __dealloc__(self): ## __dealloc__ of superclass is called by cython so no need to call here - if self._dates is not NULL: + if self._dates: free(self._dates) def __getstate__(self): @@ -516,6 +516,7 @@ cdef class SpreadCurve(Curve): cdef TDate start_date_c = pydate_to_TDate(start_date) cdef int n_dates = len(end_dates) cdef TDate* end_dates_c = malloc(n_dates * sizeof(TDate)) + cdef size_t i for i, d in enumerate(end_dates): end_dates_c[i] = pydate_to_TDate(d) cdef double* par_spreads @@ -549,29 +550,33 @@ cdef class SpreadCurve(Curve): else: for i in range(n_dates): r.append(par_spreads[i]) - free(par_spreads) + free(par_spreads) return r -def fill_curve(SpreadCurve sc, list end_dates): - cdef int n_dates = len(end_dates) - cdef TDate* end_dates_c = malloc(n_dates * sizeof(TDate)) +@cython.boundscheck(False) +@cython.wraparound(False) +@cython.initializedcheck(False) +@cython.cdivision(True) +def fill_curve(SpreadCurve sc, TDate[:] end_dates): + + cdef size_t n_dates = end_dates.shape[0] cdef double* rates = malloc(n_dates * sizeof(TDate)) cdef size_t i cdef TDate base_date = sc._thisptr.get().fBaseDate - - for i, d in enumerate(end_dates): - end_dates_c[i] = pydate_to_TDate(d) - t = (end_dates_c[i] - base_date)/365. + cdef double t + for i in range(n_dates): + t = (end_dates[i] - base_date)/365. rates[i] = -log(JpmcdsForwardZeroPrice(sc._thisptr.get(), base_date, - end_dates_c[i])) / t + end_dates[i])) / t cdef TCurve* curve = JpmcdsMakeTCurve(sc._thisptr.get().fBaseDate, - end_dates_c, + &end_dates[0], rates, n_dates, 5000., 2) cdef SpreadCurve sc_new = SpreadCurve.__new__(SpreadCurve) sc_new._thisptr = make_shared(curve) + free(rates) return sc_new -- cgit v1.2.3-70-g09d2