[Checkins] SVN: z3c.pt/trunk/src/z3c/pt/expressions.py Loop optimization. Yields about 25% increase for z3c.form.

Malthe Borch mborch at gmail.com
Wed Sep 10 17:45:00 EDT 2008


Log message for revision 91045:
  Loop optimization. Yields about 25% increase for z3c.form.

Changed:
  U   z3c.pt/trunk/src/z3c/pt/expressions.py

-=-
Modified: z3c.pt/trunk/src/z3c/pt/expressions.py
===================================================================
--- z3c.pt/trunk/src/z3c/pt/expressions.py	2008-09-10 20:27:09 UTC (rev 91044)
+++ z3c.pt/trunk/src/z3c/pt/expressions.py	2008-09-10 21:45:00 UTC (rev 91045)
@@ -1,7 +1,8 @@
 import zope.interface
 import zope.component
-import zope.traversing.adapters
 
+from zope.traversing.adapters import traversePathElement
+
 import parser
 import re
 
@@ -646,41 +647,36 @@
         return string.replace(';;', ';')
 
 class ZopeTraverser(object):
-    def __init__(self, proxify=None):
-        if proxify is None:
-            self.proxify = utils.identity
-        else:
-            self.proxify = proxify
+    def __init__(self, proxify=utils.identity):
+        self.proxify = proxify
 
     def __call__(self, base, request, call, *path_items):
         """See ``zope.app.pagetemplate.engine``."""
 
-        _callable = getattr(base, '__call__', _marker) is not _marker
-
-        for i in range(len(path_items)):
-            name = path_items[i]
-
-            next = getattr(base, name, _marker)
-            if next is not _marker:
-                _callable = getattr(next, '__call__', _marker) is not _marker
-                base = next
-                continue
-            else:
-                # special-case dicts for performance reasons        
-                if getattr(base, '__class__', None) == dict:
-                    base = base[name]
+        length = len(path_items)
+        if length:
+            i = 0
+            while i < length:
+                name = path_items[i]
+                i += 1
+                next = getattr(base, name, _marker)
+                if next is not _marker:
+                    base = next
+                    continue
                 else:
-                    base = zope.traversing.adapters.traversePathElement(
-                        base, name, path_items[i+1:], request=request)
+                    # special-case dicts for performance reasons        
+                    if isinstance(base, dict):
+                        base = base[name]
+                    else:
+                        base = traversePathElement(
+                            base, name, path_items[i:], request=request)
 
-            _callable = getattr(base, '__call__', _marker) is not _marker
+                if not isinstance(base, (basestring, tuple, list)):
+                    base = self.proxify(base)
 
-            if not isinstance(base, (basestring, tuple, list)):
-                base = self.proxify(base)
+        if call and getattr(base, '__call__', _marker) is not _marker:
+            return base()
 
-        if call and _callable:
-            base = base()
-
         return base
 
 class PathTranslation(ExpressionTranslation):



More information about the Checkins mailing list