performance of recursive generator

Duncan Booth duncan.booth at invalid.invalid
Thu Aug 11 04:39:15 EDT 2005


aurora wrote:

<generator example>
> Note that there are 4 calls to inorder() and 10 yield. Indeed the  
> complexity of traversing this kind of tree would be O(n^2)!
> 
<recursive function>
 
> There will be 4 calls to inorder() and 4 call to foo(), give a
> reasonable  O(n) performance.
> 
> Is it an inherent issue in the use of recursive generator? Is there
> any  compiler optimization possible?
> 

Do you actually have timing evidence that this is a problem with the data 
you are processing? The complexity of the algorithm may be important for 
very large data sets, but until you time it you won't know whether it is 
likely to be an issue for realistic data.

Your O(n^2) for the generator example is only n^2 if the tree is, as in 
your example, completely unbalanced. If you can keep your binary tree 
balanced it is n log n. If the tree is likely to become as wildly 
unbalanced as in your example then you should consider using a different 
data structure (e.g. a btree) where O(n log n) would be the worst case.

If you make the more realistic comparison of n calls to foo, versus nlogn 
yields the question is at what point the greater number of fast yields 
outweighs the lesser number of slow Python function calls. Until you know 
speed really is an issue, go with whichever method makes the programming 
easier.



More information about the Python-list mailing list