Changeset 5835


Ignore:
Timestamp:
13/10/09 10:44:23 (10 years ago)
Author:
pnorton
Message:

Improved the performance of the getUniqueValues method on the grid, also cached the result to avoid the cost of re-calculation.

Location:
qesdi/geoplot/trunk/lib/geoplot
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • qesdi/geoplot/trunk/lib/geoplot/colour_bar.py

    r5735 r5835  
    1111import matplotlib.cm as cm 
    1212import operator 
     13import time 
    1314 
    1415 
     
    6162        kwargs = {} 
    6263         
    63          
    64          
    6564        kwargs['cmap'] = self.getColourMap(grid) 
    6665        kwargs['norm'] = self.getNormalize(grid) 
     66         
    6767        kwargs['orientation'] = self.colourBarPosition 
    6868         
     
    7070             
    7171            cbMin, cbMax = self._getCbarMinMax() 
     72             
    7273            kwargs['ticks'] = grid.getUniqueValues(cbMin, cbMax) 
    7374             
     
    249250     
    250251    def __set_cmap(self, value): 
    251         self._cmap == value; 
     252        self._cmap = value; 
    252253         
    253254 
  • qesdi/geoplot/trunk/lib/geoplot/grid.py

    r5710 r5835  
    1010import numpy as N 
    1111import sets 
     12import time 
    1213 
    1314#third party modules 
     
    3132        self.midpointsX = midpointsX 
    3233        self.midpointsY = midpointsY 
    33         self.values = values 
     34        self._values = values 
    3435        self._uniqueValues = None 
    3536         
     
    5455        values between these bounds (inclusive) will be returned. 
    5556        """ 
    56         uniqueVals = list(sets.Set(self.values.compressed().tolist())) 
    57         uniqueVals.sort() 
     57         
     58        if self._uniqueValues is None: 
     59            st = time.time() 
     60            self._uniqueValues = N.unique(self.values) 
     61            log.debug(" unique sorted list in %s" % (time.time() - st,)) 
    5862         
    5963        if minVal != None and maxVal != None: 
    60             uniqueVals = filter(lambda x: minVal <= x <= maxVal, uniqueVals) 
     64            uniqueVals = filter(lambda x: minVal <= x <= maxVal, self._uniqueValues) 
     65            return N.array(uniqueVals) 
     66        else: 
     67            return self._uniqueValues 
    6168             
    62         return N.array(uniqueVals) 
     69         
    6370     
    6471    def getUniqueValueBounds(self, minVal=None, maxVal=None): 
     
    6976        """ 
    7077        return utils.getBounds(self.getUniqueValues(minVal, maxVal)) 
    71              
     78     
     79    def __get_values(self): 
     80        return self._values 
     81     
     82    def __set_values(self, value): 
     83        self._values = value 
     84        self._uniqueValues = None 
     85     
     86    values = property(__get_values, __set_values) 
     87     
     88     
    7289     
    7390if __name__ == '__main__': 
  • qesdi/geoplot/trunk/lib/geoplot/tests/unit/test_grid.py

    r5403 r5835  
     1from __future__ import with_statement 
     2 
    13#/urs/bin/env python 
    24""" 
     
    46""" 
    57import nose 
     8import nose.tools as nt 
    69import numpy as N 
    710 
    8 import geoplot.grid 
    911from geoplot.grid import Grid 
     12from mock import Mock, patch 
    1013 
    1114class Test_Grid(object): 
     
    1821        self.vals = N.array([[1.5, 2.0, 2.5, 3.0], [3.5, 4.0, 4.5, 5.0],  
    1922                             [5.5, 6.0, 6.5, 7.0], [7.5, 8.0, 8.5, 9.0]]) 
     23         
    2024        self.grd = Grid(self.boundX, self.boundY, self.midX, self.midY, self.vals) 
    2125         
    22      
    2326    def tearDown(self): 
    2427        self.grd = None 
     
    3134        nose.tools.assert_equal(self.vals.tolist(), self.grd.values.tolist()) 
    3235     
     36    @patch('numpy.unique') 
     37    def test_002_checkUniqueValuesAreOnlyCalculatedOnce(self, mockUniqueFunction): 
     38         
     39        mockUniqueFunction.return_value = N.array([1., 2.5, 3.6, 5.0 ]) 
     40        uniqueVals = self.grd.getUniqueValues() 
     41         
     42        #check that the expected value was returned 
     43        nt.assert_equal(id(uniqueVals), id(mockUniqueFunction.return_value)) 
     44         
     45        #check that the mock was called with the values 
     46        (args, kwargs) = mockUniqueFunction.call_args 
     47        nt.assert_equal(len(args), 1) 
     48        nt.assert_equal(id(args[0]), id(self.grd.values) ) 
     49        nt.assert_equal(kwargs, {}) 
     50         
     51        uniqueVals = self.grd.getUniqueValues() 
     52         
     53        #check it was only called once 
     54        nt.assert_equal(mockUniqueFunction.call_count, 1) 
     55             
     56    def test_003_checkUniqueValuesAreRecalculatedForDifferentVals(self): 
     57         
     58        with patch('numpy.unique') as mockUniqueFunction: 
     59            mockUniqueFunction.return_value = N.array([1., 2.5, 3.6, 5.0 ]) 
     60             
     61            uniqueVals = self.grd.getUniqueValues() 
     62            nt.assert_equal(mockUniqueFunction.call_count, 1) 
     63            nt.assert_equal(id(uniqueVals), id(mockUniqueFunction.return_value)) 
     64             
     65            #change the grid values 
     66            self.grd.values = Mock() 
     67            mockUniqueFunction.return_value = N.array([13.6, 5.0 ]) 
     68            uniqueVals = self.grd.getUniqueValues() 
     69            nt.assert_equal(id(uniqueVals), id(mockUniqueFunction.return_value)) 
     70             
     71            #check it was only called again 
     72            nt.assert_equal(mockUniqueFunction.call_count, 2) 
     73             
     74            #check that the mock was called with the new grid values 
     75            (args, kwargs) = mockUniqueFunction.call_args 
     76            nt.assert_equal(len(args), 1) 
     77            nt.assert_equal(id(args[0]), id(self.grd.values) ) 
     78            nt.assert_equal(kwargs, {})             
     79             
     80     
    3381if __name__ == '__main__': 
    3482 
    35     import geoplot.log_util 
    36     geoplot.log_util.setGeoplotHandlerToStdOut() 
    37  
    3883    nose.runmodule() 
  • qesdi/geoplot/trunk/lib/geoplot/tests/unit/test_grid_builder_lat_lon_2.py

    r5826 r5835  
    99import numpy 
    1010from mock import Mock 
    11 import mock 
    12  
    13  
    14  
    15 def _is_magic(name): 
    16     if name == '__getslice__': 
    17         return False 
    18     return '__%s__' % name[2:-2] == name 
    19  
    20 mock._is_magic = _is_magic 
    2111 
    2212import nose.tools as nt 
    2313 
    24 import geoplot.grid_builder_base 
    2514from geoplot.grid_builder_lat_lon import GridBuilderLatLon 
    26 from geoplot.grid import Grid 
    2715 
    2816 
Note: See TracChangeset for help on using the changeset viewer.