[Erp5-dev] [Erp5-report] r26242 - in /erp5/trunk/products/ERP5: Tool/ tests/
Julien Muchembled
jm at nexedi.com
Thu Apr 2 16:34:33 CEST 2009
Yoshinori Okuji a écrit :
> I don't understand why you need to *deprecate* cmp.
I explained in the commit message that using 'cmp' parameter in sorting methods (list.sort & sorted) is slow and deprecated. This is a fact.
More precisely:
* In almost all cases, 'cmp' is _much_ slower that 'key'. In the rare cases where using 'cmp' could be faster, it is possible to write a 'key' func that behaves like a 'cmp': cf
http://code.activestate.com/recipes/576653/ (Convert a cmp function to a key function).
* 'cmp' parameter doesn't exist in Python 3 (and I suppose it will also disappear in a future 2.x version). I know this is really far future but it appears we already need to convert existing code due to performance issues.
Knowing all this, it is not serious to keep using 'cmp' in new code.
Julien
> On Thursday 02 April 2009 00:01:13 nobody at svn.erp5.org wrote:
>> Author: jm
>> Date: Wed Apr 1 17:01:12 2009
>> New Revision: 26242
>>
>> URL: http://svn.erp5.org?rev=26242&view=rev
>> Log:
>> Deprecate sort_method parameter in DomainTool.searchPredicateList since cmp
>> parameter in sorting methods is slow and deprecated. Add new
>> sort_key_method parameter that is passed as key parameter to list.sort.
>>
>> Modified:
>> erp5/trunk/products/ERP5/Tool/DomainTool.py
>> erp5/trunk/products/ERP5/tests/testDomainTool.py
>>
>> Modified: erp5/trunk/products/ERP5/Tool/DomainTool.py
>> URL:
>> http://svn.erp5.org/erp5/trunk/products/ERP5/Tool/DomainTool.py?rev=26242&r
>> 1=26241&r2=26242&view=diff
>> ===========================================================================
>> === --- erp5/trunk/products/ERP5/Tool/DomainTool.py [utf8] (original)
>> +++ erp5/trunk/products/ERP5/Tool/DomainTool.py [utf8] Wed Apr 1 17:01:12
>> 2009 @@ -60,7 +60,7 @@
>> ignored_category_list=None,
>> tested_base_category_list=None,
>> filter_method=None, acquired=1,
>> - strict=True, **kw):
>> + strict=True, sort_key_method=None, **kw):
>> # XXX: about "strict" parameter: This is a transition parameter,
>> # allowing someone hitting a bug to revert to original behaviour
>> easily. # It is not a correct name, as pointed out by Jerome. But instead
>> of @@ -68,9 +68,11 @@
>> """
>> Search all predicates which corresponds to this particular
>> context.
>> -
>> - - The sort_method parameter allows to give a method which will be
>> - used in order to sort the list of predicates found. The most
>> +
>> + - sort_method parameter is deprecated: use sort_key_method instead.
>> +
>> + - sort_key_method parameter is passed to list.sort as key parameter
>> if it + is not None. This allows to sort the list of predicates
>> found. The most important predicate is the first one in the list.
>>
>> - ignored_category_list: this is the list of category that we do
>> @@ -203,8 +205,12 @@
>> # LOG('searchPredicateList, result_list before sort', 0,
>> result_list) if filter_method is not None:
>> result_list = filter_method(result_list)
>> - if sort_method is not None:
>> - result_list.sort(sort_method)
>> + if sort_key_method is not None:
>> + result_list.sort(key=sort_key_method)
>> + elif sort_method is not None:
>> + LOG('searchPredicateList', 0,
>> + 'sort_method parameter is deprecated: sort_key_method
>> instead') + result_list.sort(cmp=sort_method)
>> # LOG('searchPredicateList, result_list after sort', 0, result_list)
>> return result_list
>>
>>
>> Modified: erp5/trunk/products/ERP5/tests/testDomainTool.py
>> URL:
>> http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testDomainTool.py?rev=26
>> 242&r1=26241&r2=26242&view=diff
>> ===========================================================================
>> === --- erp5/trunk/products/ERP5/tests/testDomainTool.py [utf8] (original)
>> +++ erp5/trunk/products/ERP5/tests/testDomainTool.py [utf8] Wed Apr 1
>> 17:01:12 2009 @@ -376,6 +376,10 @@
>> return -1
>> return 0
>>
>> + def sort_key_method(x):
>> + hasCellContent = getattr(x, 'hasCellContent', None)
>> + return bool(hasCellContent and hasCellContent(base_id='path'))
>> +
>> get_transaction().commit()
>> self.tic()
>> domain_tool = self.getDomainTool()
>> @@ -384,16 +388,24 @@
>> 'variation/%s/blue' %
>> self.resource.getRelativeUrl()]) mapped_value =
>> domain_tool.generateMappedValue(context,sort_method=sort_method)
>> self.assertEquals(mapped_value.getProperty('base_price'),45)
>> + mapped_value =
>> domain_tool.generateMappedValue(context,sort_key_method=sort_key_method) +
>> self.assertEquals(mapped_value.getProperty('base_price'),45)
>> context = self.resource.asContext(
>> categories=['resource/%s' %
>> self.resource.getRelativeUrl(), 'variation/%s/red' %
>> self.resource.getRelativeUrl()]) mapped_value =
>> domain_tool.generateMappedValue(context,sort_method=sort_method) +
>> self.assertEquals(mapped_value.getProperty('base_price'),26)
>> + mapped_value =
>> domain_tool.generateMappedValue(context,sort_key_method=sort_key_method)
>> self.assertEquals(mapped_value.getProperty('base_price'),26)
>> # Now check the price
>>
>> self.assertEquals(self.resource.getPrice(context=self.resource.asContext(
>> categories=['resource/%s' % self.resource.getRelativeUrl(),
>> 'variation/%s/blue' % self.resource.getRelativeUrl()]),
>> sort_method=sort_method),45)
>> +
>> self.assertEquals(self.resource.getPrice(context=self.resource.asContext( +
>> categories=['resource/%s' %
>> self.resource.getRelativeUrl(), + 'variation/%s/blue' %
>> self.resource.getRelativeUrl()]), +
>> sort_key_method=sort_key_method),45)
>>
>> def test_06_SQLQueryDoesNotReturnTooManyPredicates(self, quiet=0,
>> run=run_all_test): if not run: return
>>
>> _______________________________________________
>> Erp5-report mailing list
>> Erp5-report at erp5.org
>> http://mail.nexedi.com/mailman/listinfo/erp5-report
>
>
>
More information about the Erp5-dev
mailing list