Django

Code

Changeset 7246

Show
Ignore:
Timestamp:
03/15/08 04:12:44 (7 months ago)
Author:
mtredinnick
Message:

queryset-refactor: Optimised len(qs) and iter(qs) a bit.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/queryset-refactor/django/db/models/query.py

    r7245 r7246  
    2929 
    3030    def __repr__(self): 
    31         return repr(list(iter(self))) 
     31        return repr(list(self)) 
    3232 
    3333    def __len__(self): 
    34         return len(list(iter(self))) 
     34        # Since __len__ is called quite frequently (as part of list(qs), which 
     35        # means as part of qs.get(), for example), we make some effort here to 
     36        # be as efficient as possible whilst not messing up any existing 
     37        # iterators against the queryset. 
     38        if self._result_cache is None: 
     39            if self._iter: 
     40                self._result_cache = list(self._iter()) 
     41            else: 
     42                self._result_cache = list(self.iterator()) 
     43        elif self._iter: 
     44            self.result_cache.extend(list(self._iter)) 
     45        return len(self._result_cache) 
    3546 
    3647    def __iter__(self): 
    37         pos = 0 
    3848        if self._result_cache is None: 
    3949            self._iter = self.iterator() 
    4050            self._result_cache = [] 
     51        if self._iter: 
     52            return self._result_iter() 
     53        return iter(self._result_cache) 
     54 
     55    def _result_iter(self): 
     56        pos = 0 
    4157        while 1: 
    4258            upper = len(self._result_cache)