summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuillaume Horel <guillaume.horel@gmail.com>2017-05-12 10:34:09 -0400
committerGuillaume Horel <guillaume.horel@gmail.com>2017-05-12 10:34:09 -0400
commit6cbe0d8aef93bbd8be02e42b2959b4d6ece625ba (patch)
treeb4c463e4b6d18d5d8a51d2f096bbc475cd547b44
parent43cd9a00af77489ff4c0413e060e0b276d6d6bb4 (diff)
downloadpyisda-6cbe0d8aef93bbd8be02e42b2959b4d6ece625ba.tar.gz
small speedups and bugfix
-rw-r--r--pyisda/curve.pyx27
1 files 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 = <TDate*>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 = <TDate*>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 = <double*>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