From 0ac3fa708f373ebba69547dfc76c7083ac0310c6 Mon Sep 17 00:00:00 2001 From: Don Cross Date: Wed, 3 Jul 2019 21:46:18 -0400 Subject: [PATCH] fixaddsol: Major performance improvement: 29.1 seconds. Use dictionaries instead of creating custom array classes. That way co[] and si[] subscripts are much faster. --- generate/template/astronomy.py | 24 ++++-------------------- generate/template/old.py | 24 ++++-------------------- source/python/astronomy.py | 24 ++++-------------------- 3 files changed, 12 insertions(+), 60 deletions(-) diff --git a/generate/template/astronomy.py b/generate/template/astronomy.py index 0c7f47e6..b099eab7 100644 --- a/generate/template/astronomy.py +++ b/generate/template/astronomy.py @@ -623,27 +623,11 @@ def _spin(angle, pos1): #---------------------------------------------------------------------------- # BEGIN CalcMoon -class _Array1: - def __init__(self, xmin, xmax): - self.min = xmin - self.array = [0] * (xmax - xmin + 1) +def _Array1(xmin, xmax): + return dict((key, 0) for key in range(xmin, 1+xmax)) - def __getitem__(self, key): - return self.array[key - self.min] - - def __setitem__(self, key, value): - self.array[key - self.min] = value - -class _Array2: - def __init__(self, xmin, xmax, ymin, ymax): - self.min = xmin - self.array = [_Array1(ymin, ymax) for i in range(xmax - xmin + 1)] - - def __getitem__(self, key): - return self.array[key - self.min] - - def __setitem__(self, key, value): - self.array[key - self.min] = value +def _Array2(xmin, xmax, ymin, ymax): + return dict((key, _Array1(ymin, ymax)) for key in range(xmin, 1+xmax)) class _moonpos: def __init__(self, lon, lat, dist): diff --git a/generate/template/old.py b/generate/template/old.py index 513af27f..e1081be2 100644 --- a/generate/template/old.py +++ b/generate/template/old.py @@ -623,27 +623,11 @@ def _spin(angle, pos1): #---------------------------------------------------------------------------- # BEGIN CalcMoon -class _Array1: - def __init__(self, xmin, xmax): - self.min = xmin - self.array = [0] * (xmax - xmin + 1) +def _Array1(xmin, xmax): + return dict((key, 0) for key in range(xmin, 1+xmax)) - def __getitem__(self, key): - return self.array[key - self.min] - - def __setitem__(self, key, value): - self.array[key - self.min] = value - -class _Array2: - def __init__(self, xmin, xmax, ymin, ymax): - self.min = xmin - self.array = [_Array1(ymin, ymax) for i in range(xmax - xmin + 1)] - - def __getitem__(self, key): - return self.array[key - self.min] - - def __setitem__(self, key, value): - self.array[key - self.min] = value +def _Array2(xmin, xmax, ymin, ymax): + return dict((key, _Array1(ymin, ymax)) for key in range(xmin, 1+xmax)) class _moonpos: def __init__(self, lon, lat, dist): diff --git a/source/python/astronomy.py b/source/python/astronomy.py index ac69f31e..db1ef26b 100644 --- a/source/python/astronomy.py +++ b/source/python/astronomy.py @@ -714,27 +714,11 @@ def _spin(angle, pos1): #---------------------------------------------------------------------------- # BEGIN CalcMoon -class _Array1: - def __init__(self, xmin, xmax): - self.min = xmin - self.array = [0] * (xmax - xmin + 1) +def _Array1(xmin, xmax): + return dict((key, 0) for key in range(xmin, 1+xmax)) - def __getitem__(self, key): - return self.array[key - self.min] - - def __setitem__(self, key, value): - self.array[key - self.min] = value - -class _Array2: - def __init__(self, xmin, xmax, ymin, ymax): - self.min = xmin - self.array = [_Array1(ymin, ymax) for i in range(xmax - xmin + 1)] - - def __getitem__(self, key): - return self.array[key - self.min] - - def __setitem__(self, key, value): - self.array[key - self.min] = value +def _Array2(xmin, xmax, ymin, ymax): + return dict((key, _Array1(ymin, ymax)) for key in range(xmin, 1+xmax)) class _moonpos: def __init__(self, lon, lat, dist):