mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	Issue #21101: Eliminate double hashing in the C code for collections.Counter().
This commit is contained in:
		
							parent
							
								
									4b74fba62f
								
							
						
					
					
						commit
						4b0b1accb5
					
				
					 2 changed files with 17 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -73,6 +73,9 @@ Library
 | 
			
		|||
  Decimal.quantize() method in the Python version.  It had never been
 | 
			
		||||
  present in the C version.
 | 
			
		||||
 | 
			
		||||
- Issue #21101: Eliminate double hashing in the C speed-up code for
 | 
			
		||||
  collections.Counter().
 | 
			
		||||
 | 
			
		||||
- Issue #21321: itertools.islice() now releases the reference to the source
 | 
			
		||||
  iterator when the slice is exhausted.  Patch by Anton Afanasyev.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1831,18 +1831,29 @@ _count_elements(PyObject *self, PyObject *args)
 | 
			
		|||
    if (mapping_get != NULL && mapping_get == dict_get &&
 | 
			
		||||
        mapping_setitem != NULL && mapping_setitem == dict_setitem) {
 | 
			
		||||
        while (1) {
 | 
			
		||||
            Py_hash_t hash;
 | 
			
		||||
 | 
			
		||||
            key = PyIter_Next(it);
 | 
			
		||||
            if (key == NULL)
 | 
			
		||||
                break;
 | 
			
		||||
            oldval = PyDict_GetItem(mapping, key);
 | 
			
		||||
 | 
			
		||||
            if (!PyUnicode_CheckExact(key) ||
 | 
			
		||||
                (hash = ((PyASCIIObject *) key)->hash) == -1)
 | 
			
		||||
            {
 | 
			
		||||
                hash = PyObject_Hash(key);
 | 
			
		||||
                if (hash == -1) 
 | 
			
		||||
                    goto done;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            oldval = _PyDict_GetItem_KnownHash(mapping, key, hash);
 | 
			
		||||
            if (oldval == NULL) {
 | 
			
		||||
                if (PyDict_SetItem(mapping, key, one) == -1)
 | 
			
		||||
                if (_PyDict_SetItem_KnownHash(mapping, key, one, hash) == -1)
 | 
			
		||||
                    break;
 | 
			
		||||
            } else {
 | 
			
		||||
                newval = PyNumber_Add(oldval, one);
 | 
			
		||||
                if (newval == NULL)
 | 
			
		||||
                    break;
 | 
			
		||||
                if (PyDict_SetItem(mapping, key, newval) == -1)
 | 
			
		||||
                if (_PyDict_SetItem_KnownHash(mapping, key, newval, hash) == -1)
 | 
			
		||||
                    break;
 | 
			
		||||
                Py_CLEAR(newval);
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue