changeset 957:51ab60299647 experimental-performance-improvement-exploration

Simplify _assignment and add fast-path.
author hodgestar
date Tue, 13 Mar 2012 01:00:17 +0000
parents f266bfdbac2c
children 6fc92535c888
files genshi/template/directives.py
diffstat 1 files changed, 24 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/genshi/template/directives.py
+++ b/genshi/template/directives.py
@@ -115,22 +115,35 @@
                                       offset + (err.offset or 0))
 
 
+def _names(node):
+    if isinstance(node, _ast.Tuple):
+        return tuple([_names(child) for child in node.elts])
+    elif isinstance(node, _ast.Name):
+        return node.id
+
+
+def _assign(data, value, names):
+    for idx in range(len(names)):
+        name = names[idx]
+        if type(name) is tuple:
+            _assign(data, value[idx], name)
+        else:
+            data[name] = value[idx]
+
+
 def _assignment(ast):
     """Takes the AST representation of an assignment, and returns a
     function that applies the assignment of a given value to a dictionary.
     """
-    def _names(node):
-        if isinstance(node, _ast.Tuple):
-            return tuple([_names(child) for child in node.elts])
-        elif isinstance(node, _ast.Name):
-            return node.id
-    def _assign(data, value, names=_names(ast)):
-        if type(names) is tuple:
-            for idx in range(len(names)):
-                _assign(data, value[idx], names[idx])
-        else:
+    names = _names(ast)
+    if type(names) is tuple:
+        def _slow_assign(data, value):
+            _assign(data, value, names=names)
+        return _slow_assign
+    else:
+        def _fast_assign(data, value):
             data[names] = value
-    return _assign
+        return _fast_assign
 
 
 class AttrsDirective(Directive):
Copyright (C) 2012-2017 Edgewall Software