minor speedup to python/rna api keyword argument lookups.

- dont use hash lookups in this case because converting the string to unicode and doing a hash lookup is slower then looping over the keys and comparing (which avoids creating and throwning away a unicode string).
This commit is contained in:
Campbell Barton
2011-08-19 10:38:34 +00:00
parent 561b49e925
commit 2c1182664c

View File

@@ -4297,6 +4297,27 @@ static PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *dat
return ret;
}
/* Use to replace PyDict_GetItemString() when the overhead of converting a
* string into a python unicode is higher than a non hash lookup.
* works on small dict's such as keyword args. */
static PyObject *small_dict_get_item_string(PyObject *dict, const char *key_lookup)
{
PyObject *key= NULL;
Py_ssize_t pos = 0;
PyObject *value = NULL;
/* case not, search for it in the script's global dictionary */
while (PyDict_Next(dict, &pos, &key, &value)) {
if(PyUnicode_Check(key)) {
if(strcmp(key_lookup, _PyUnicode_AsString(key))==0) {
return value;
}
}
}
return NULL;
}
static PyObject *pyrna_func_call(BPy_FunctionRNA *self, PyObject *args, PyObject *kw)
{
/* Note, both BPy_StructRNA and BPy_PropertyRNA can be used here */
@@ -4391,7 +4412,11 @@ static PyObject *pyrna_func_call(BPy_FunctionRNA *self, PyObject *args, PyObject
kw_arg= FALSE;
}
else if (kw != NULL) {
#if 0
item= PyDict_GetItemString(kw, RNA_property_identifier(parm)); /* borrow ref */
#else
item= small_dict_get_item_string(kw, RNA_property_identifier(parm)); /* borrow ref */
#endif
if(item)
kw_tot++; /* make sure invalid keywords are not given */