[Python-bugs-list] [ python-Bugs-420490 ] lookdict_string does not use interning

noreply@sourceforge.net noreply@sourceforge.net
Tue, 01 May 2001 10:20:36 -0700


Bugs item #420490, was updated on 2001-05-01 10:06
You can respond by visiting: 
http://sourceforge.net/tracker/?func=detail&atid=105470&aid=420490&group_id=5470

Category: Python Interpreter Core
Group: None
Status: Open
Resolution: None
Priority: 5
Submitted By: Greg Chapman (glchapman)
Assigned to: Nobody/Anonymous (nobody)
Summary: lookdict_string does not use interning

Initial Comment:
In Python 2.1, when a dictionary uses lookdict_string 
to retrieve items, the function used to compare 
strings is PyString_Type.tp_compare, i.e. 
string_compare.  string_compare does not check if its 
parameters are actually the same PStringObject *, so 
an actual string comparison is made even if the 
dictionary's keys have been interned.  Python 1.52 
used PyObject_Compare to compare all keys, and this 
function did check to see if its parameters were the 
same PyObject *.

I wonder if this might be one source of the slow-down 
in Python 2.1?


----------------------------------------------------------------------

>Comment By: Greg Chapman (glchapman)
Date: 2001-05-01 10:20

Message:
Logged In: YES 
user_id=86307

Actually, I apologize for wasting everyone's time.  This 
report is totally false; I missed this line:

	if (ep->me_key == NULL || ep->me_key == key)
		return ep;

Please ignore this.  I'm going to go get some sleep.



----------------------------------------------------------------------

Comment By: Greg Chapman (glchapman)
Date: 2001-05-01 10:17

Message:
Logged In: YES 
user_id=86307

Actually, to be more specific, only the first comparison in 
lookdict_string forgets to see if the string pointers are 
the same.  I assume the proper fix would be to change this 
first comparison to be:

 	if (ep->me_key == dummy)
 		freeslot = ep;
 	else {
-		if (ep->me_hash == hash
-		    && compare(ep->me_key, key) == 0) {
+		if (ep->me_key == key
+                    || (ep->me_hash == hash
+		    && compare(ep->me_key, key) == 0)) {
 			return ep;
 		}
 		freeslot = NULL;
 	}


----------------------------------------------------------------------

You can respond by visiting: 
http://sourceforge.net/tracker/?func=detail&atid=105470&aid=420490&group_id=5470