Optimizing Inner Loop Copy

Mark E. Fenner mfenner at gmail.com
Thu Aug 17 23:00:20 EDT 2006


danielx wrote:

> 
> Mark E. Fenner wrote:
>> Mark E. Fenner wrote:
>>
>> > John Machin wrote:
>> >
>> >>
>> >> Mark E. Fenner wrote:
>> >>
>> >>> Here's my class of the objects being copied:
>> >>
>> >> Here's a couple of things that might help speed up your __init__
>> >> method, and hence your copy method:
>> >>
>> >>>
>> >>> class Rule(list):
>> >>>     def __init__(self, lhs=None, rhs=None, nClasses=0, nCases=0):
>> >>
>> >>     def __init__(self, lhs=None, rhs=(), nClasses=0, nCases=0):
>> >>
>> >>>         self.nClasses = nClasses
>> >>>         self.nCases = nCases
>> >>>
>> >>>         if lhs is not None:
>> >>>             self.extend(lhs)
>> >> what does the extend method do? If it is small, perhaps inline a copy
>> >> of its code here.
>> >>>
>> >>>         if rhs is None:
>> >>>             self.rhs=tuple()
>> >>>         else:
>> >>>             self.rhs=rhs
>> >>
>> >> Replace the above 4 lines by:
>> >>     self.rhs = rhs
>> >>
>> >> HTH,
>> >> John
>> >
>> > John,
>> >
>> > Thanks.  I thought of those at the same you did!  I also incorporated
>> > one other use of the default=() + no conditional:
>> >
>> > class Rule(list):
>> >     def __init__(self, lhs=(), rhs=(), nClasses=0, nCases=0):
>> >         self.nClasses = nClasses
>> >         self.nCases = nCases
>> >         self.extend(lhs) # note, self is a list so this is list.extend
>> >         self.rhs=rhs
>> >
>> >     def copy(self):
>> >         return Rule(self,
>> >                     self.rhs,
>> >                     self.nClasses,
>> >                     self.nCases)
>>
>>
>> Actually, I also removed the "passthrough" that copy was doing and just
>> called the constructor directly.  So, at the top level code, we have:
>>
>> allNew = []
>> for params in cases:
>>     # newobj = initialObject.copy()
>>     newObj = Rule(initialObject, initialObject.rhs,
>>                   initialObject.nClasses,
>>                   initialObject.nCases)
>>     newObj.modify(params)
>>     allNew.append(newObj)
>> return allNew
>>
>> Regards,
>> Mark
> 
> I'm not sure how much this will help, but another thing you can do is
> put this line before the "for":
> 
> append = allNew.append
> 
> Then, replace the last line in the loop with
> 
> append(newObj)
> 
> Check out this doc for more info on optimizing Python, and the section
> which talks about eliminating dots:
> 
> http://wiki.python.org/moin/PythonSpeed/PerformanceTips
>
http://wiki.python.org/moin/PythonSpeed/PerformanceTips#head-aa6c07c46a630a2fa10bd6502510e532806f1f62

I've read these, but they do yield additional nuggets upon rereading (does
that make them generators?).  In reality, my loop has several lines of code
instead of a newObj.modify(args) method.  I localised the obvious functions
and attributes that I was using.  In reality, the Rule.copy/Rule.__init__
is swamping everything else ... humm, unless ... I'll get back to you.

Regards,
Mark



More information about the Python-list mailing list