diff -r 5524e3b7aa88 Python/ceval.c --- a/Python/ceval.c Wed Jun 11 19:27:50 2008 +0200 +++ b/Python/ceval.c Wed Jun 11 20:37:00 2008 +0200 @@ -2762,14 +2762,22 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyOb PyString_AsString(co->co_name)); goto fail; } - /* XXX slow -- speed up using dictionary? */ + /* Speed hack: do raw pointer compares. As names are + normally interned this should almost always hit. */ + for (j = 0; j < co->co_argcount; j++) { + PyObject *nm = PyTuple_GET_ITEM( + co->co_varnames, j); + if (nm == keyword) + goto kw_found; + } + /* Slow fallback, just in case */ for (j = 0; j < co->co_argcount; j++) { PyObject *nm = PyTuple_GET_ITEM( co->co_varnames, j); int cmp = PyObject_RichCompareBool( keyword, nm, Py_EQ); if (cmp > 0) - break; + goto kw_found; else if (cmp < 0) goto fail; } @@ -2786,20 +2794,20 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyOb goto fail; } PyDict_SetItem(kwdict, keyword, value); - } - else { - if (GETLOCAL(j) != NULL) { - PyErr_Format(PyExc_TypeError, - "%.200s() got multiple " - "values for keyword " - "argument '%.400s'", - PyString_AsString(co->co_name), - PyString_AsString(keyword)); - goto fail; - } - Py_INCREF(value); - SETLOCAL(j, value); - } + continue; + } + kw_found: + if (GETLOCAL(j) != NULL) { + PyErr_Format(PyExc_TypeError, + "%.200s() got multiple " + "values for keyword " + "argument '%.400s'", + PyString_AsString(co->co_name), + PyString_AsString(keyword)); + goto fail; + } + Py_INCREF(value); + SETLOCAL(j, value); } if (argcount < co->co_argcount) { int m = co->co_argcount - defcount; diff -r 5524e3b7aa88 Tools/pybench/Calls.py --- a/Tools/pybench/Calls.py Wed Jun 11 19:27:50 2008 +0200 +++ b/Tools/pybench/Calls.py Wed Jun 11 20:37:00 2008 +0200 @@ -3,7 +3,7 @@ class PythonFunctionCalls(Test): class PythonFunctionCalls(Test): version = 2.0 - operations = 5*(1+4+4+2) + operations = 5*(1+4+4+3) rounds = 60000 def test(self): @@ -37,6 +37,7 @@ class PythonFunctionCalls(Test): g(i,i,i) h(i,i,3,i,i) h(i,i,i,2,i,3) + h(i,i,f=i,e=2,d=i,c=3) f() f1(i) @@ -49,6 +50,7 @@ class PythonFunctionCalls(Test): g(i,i,i) h(i,i,3,i,i) h(i,i,i,2,i,3) + h(i,i,f=i,e=2,d=i,c=3) f() f1(i) @@ -61,6 +63,7 @@ class PythonFunctionCalls(Test): g(i,i,i) h(i,i,3,i,i) h(i,i,i,2,i,3) + h(i,i,f=i,e=2,d=i,c=3) f() f1(i) @@ -73,6 +76,7 @@ class PythonFunctionCalls(Test): g(i,i,i) h(i,i,3,i,i) h(i,i,i,2,i,3) + h(i,i,f=i,e=2,d=i,c=3) f() f1(i) @@ -85,6 +89,7 @@ class PythonFunctionCalls(Test): g(i,i,i) h(i,i,3,i,i) h(i,i,i,2,i,3) + h(i,i,f=i,e=2,d=i,c=3) def calibrate(self):