Commit 14b08598 authored by Stefan Behnel's avatar Stefan Behnel

Speed up some dict lookups in Py3.5+ by calling the faster...

Speed up some dict lookups in Py3.5+ by calling the faster "_PyDict_GetItem_KnownHash()" instead of "PyDict_GetItem()".
parent db2d4743
...@@ -3830,12 +3830,12 @@ class DefNodeWrapper(FuncDefNode): ...@@ -3830,12 +3830,12 @@ class DefNodeWrapper(FuncDefNode):
continue continue
code.putln('if (kw_args > 0) {') code.putln('if (kw_args > 0) {')
# don't overwrite default argument # don't overwrite default argument
code.putln('PyObject* value = PyDict_GetItem(%s, %s);' % ( code.putln('PyObject* value = __Pyx_PyDict_GetItemStr(%s, %s);' % (
Naming.kwds_cname, pystring_cname)) Naming.kwds_cname, pystring_cname))
code.putln('if (value) { values[%d] = value; kw_args--; }' % i) code.putln('if (value) { values[%d] = value; kw_args--; }' % i)
code.putln('}') code.putln('}')
else: else:
code.putln('if (likely((values[%d] = PyDict_GetItem(%s, %s)) != 0)) kw_args--;' % ( code.putln('if (likely((values[%d] = __Pyx_PyDict_GetItemStr(%s, %s)) != 0)) kw_args--;' % (
i, Naming.kwds_cname, pystring_cname)) i, Naming.kwds_cname, pystring_cname))
if i < min_positional_args: if i < min_positional_args:
if i == 0: if i == 0:
...@@ -3921,7 +3921,7 @@ class DefNodeWrapper(FuncDefNode): ...@@ -3921,7 +3921,7 @@ class DefNodeWrapper(FuncDefNode):
else: else:
code.putln('if (kw_args == 1) {') code.putln('if (kw_args == 1) {')
code.putln('const Py_ssize_t index = %d;' % first_optional_arg) code.putln('const Py_ssize_t index = %d;' % first_optional_arg)
code.putln('PyObject* value = PyDict_GetItem(%s, *%s[index]);' % ( code.putln('PyObject* value = __Pyx_PyDict_GetItemStr(%s, *%s[index]);' % (
Naming.kwds_cname, Naming.pykwdlist_cname)) Naming.kwds_cname, Naming.pykwdlist_cname))
code.putln('if (value) { values[index] = value; kw_args--; }') code.putln('if (value) { values[index] = value; kw_args--; }')
if len(optional_args) > 1: if len(optional_args) > 1:
......
...@@ -109,7 +109,7 @@ static PyObject* __Pyx_PyExec3(PyObject* o, PyObject* globals, PyObject* locals) ...@@ -109,7 +109,7 @@ static PyObject* __Pyx_PyExec3(PyObject* o, PyObject* globals, PyObject* locals)
locals = globals; locals = globals;
} }
if (PyDict_GetItem(globals, PYIDENT("__builtins__")) == NULL) { if (__Pyx_PyDict_GetItemStr(globals, PYIDENT("__builtins__")) == NULL) {
if (PyDict_SetItem(globals, PYIDENT("__builtins__"), PyEval_GetBuiltins()) < 0) if (PyDict_SetItem(globals, PYIDENT("__builtins__"), PyEval_GetBuiltins()) < 0)
goto bad; goto bad;
} }
......
...@@ -580,7 +580,7 @@ static int __Pyx_CLineForTraceback(CYTHON_UNUSED PyThreadState *tstate, int c_li ...@@ -580,7 +580,7 @@ static int __Pyx_CLineForTraceback(CYTHON_UNUSED PyThreadState *tstate, int c_li
#if CYTHON_COMPILING_IN_CPYTHON #if CYTHON_COMPILING_IN_CPYTHON
cython_runtime_dict = _PyObject_GetDictPtr(${cython_runtime_cname}); cython_runtime_dict = _PyObject_GetDictPtr(${cython_runtime_cname});
if (likely(cython_runtime_dict)) { if (likely(cython_runtime_dict)) {
use_cline = PyDict_GetItem(*cython_runtime_dict, PYIDENT("cline_in_traceback")); use_cline = __Pyx_PyDict_GetItemStr(*cython_runtime_dict, PYIDENT("cline_in_traceback"));
} else } else
#endif #endif
{ {
......
...@@ -273,6 +273,12 @@ ...@@ -273,6 +273,12 @@
#define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y)
#endif #endif
#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1
#define __Pyx_PyDict_GetItemStr(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash)
#else
#define __Pyx_PyDict_GetItemStr(dict, name) PyDict_GetItem(dict, name)
#endif
/* new Py3.3 unicode type (PEP 393) */ /* new Py3.3 unicode type (PEP 393) */
#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND)
#define CYTHON_PEP393_ENABLED 1 #define CYTHON_PEP393_ENABLED 1
......
...@@ -808,7 +808,7 @@ static PyObject *__Pyx_Py3MetaclassGet(PyObject *bases, PyObject *mkw); /*proto* ...@@ -808,7 +808,7 @@ static PyObject *__Pyx_Py3MetaclassGet(PyObject *bases, PyObject *mkw); /*proto*
//@requires: CalculateMetaclass //@requires: CalculateMetaclass
static PyObject *__Pyx_Py3MetaclassGet(PyObject *bases, PyObject *mkw) { static PyObject *__Pyx_Py3MetaclassGet(PyObject *bases, PyObject *mkw) {
PyObject *metaclass = mkw ? PyDict_GetItem(mkw, PYIDENT("metaclass")) : NULL; PyObject *metaclass = mkw ? __Pyx_PyDict_GetItemStr(mkw, PYIDENT("metaclass")) : NULL;
if (metaclass) { if (metaclass) {
Py_INCREF(metaclass); Py_INCREF(metaclass);
if (PyDict_DelItem(mkw, PYIDENT("metaclass")) < 0) { if (PyDict_DelItem(mkw, PYIDENT("metaclass")) < 0) {
...@@ -845,7 +845,7 @@ static PyObject *__Pyx_CreateClass(PyObject *bases, PyObject *dict, PyObject *na ...@@ -845,7 +845,7 @@ static PyObject *__Pyx_CreateClass(PyObject *bases, PyObject *dict, PyObject *na
return NULL; return NULL;
/* Python2 __metaclass__ */ /* Python2 __metaclass__ */
metaclass = PyDict_GetItem(dict, PYIDENT("__metaclass__")); metaclass = __Pyx_PyDict_GetItemStr(dict, PYIDENT("__metaclass__"));
if (metaclass) { if (metaclass) {
Py_INCREF(metaclass); Py_INCREF(metaclass);
if (PyType_Check(metaclass)) { if (PyType_Check(metaclass)) {
......
...@@ -40,7 +40,7 @@ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { ...@@ -40,7 +40,7 @@ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
return -1; return -1;
// initialise cached hash value // initialise cached hash value
if (PyObject_Hash(*t->p) == -1) if (PyObject_Hash(*t->p) == -1)
PyErr_Clear(); return -1;
++t; ++t;
} }
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment