Adjust the value in objects' insertion order array to the index - position.
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 77.2k
- Forks
- 35.9k
- Métriques de merge des PR
- Métriques de PR en attente
Description
Currently, we store an array of bytes at the end of the inline value array of objects to record the insertion order.
This is expensive as we need to compute not only the value to insert, but where to insert it. Here's the code:
PyDictValues *values = _PyObject_InlineValues(owner_o);
Py_ssize_t index = value_ptr - values->values;
_PyDictValues_AddToInsertionOrder(values, index);
_PyObject_InlineValues requires some lookup, as it depends on tp->basicsize
return (PyDictValues *)((char *)obj + tp->tp_basicsize);
but it is _PyDictValues_AddToInsertionOrder that is the slowest:
int size = values->size;
uint8_t *array = (uint8_t *)&values->values[values->capacity];
array[size] = (uint8_t)ix;
values->size = size+1;
If instead of storing the delta of the index and position, instead of just the index, for the majority of objects the insert order array will go from { 0, 1, 2, 3, 4, ... } to { 0, 0, 0, 0, 0, ... }
And if the delta is zero, we don't need to store anything.
PyDictValues *values = _PyObject_InlineValues(owner_o);
Py_ssize_t index = value_ptr - values->values;
Py_ssize_t delta = index - values->size;
if (delta != 0) {
/* This is the expensive part */
_PyDictValues_AddToInsertionOrder(values, delta);
}
values->size++;
In the JIT we can track the size of the inline values, and know when delta will be zero. Reducing the above code to
values->size = KNOWN_SIZE;
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par suivre _PyObject_InlineValues et _PyDictValues_AddToInsertionOrder, puis examinez le chemin JIT décrit dans l’issue afin de comprendre comment la taille des valeurs inline est suivie. Le travail est terminé lorsque le stockage de l’ordre d’insertion utilise le comportement zero-delta proposé sans modifier l’ordre des objets, et que le comportement du runtime concerné reste correct.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- c, python
- Domaine
- backend, performance
- Type d'issue
- Refactorisation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- Calme
- Clarté
- Plutôt claire
- Accessibilité débutants
- 45/100