Improve performance by using reference stealing methods
Nessuno ha ancora preso questa issue.
- Lingua principale
- Python
- Stelle
- 77.2k
- Fork
- 35.9k
- Metriche di merge delle PR
- Metriche PR in attesa
Descrizione
Feature or enhancement
Proposal:
We can improve performance of cpython by using stealing methods (_PyList_AppendTakeRef, _PyDict_SetItem_Take2, PyTuple_FromPairSteal etc.) instead of the normal ones. Using stealing methods we typically avoid an incref/decref pair and sometimes error handling is simplified. We should only make changes where it makes a performance impact, the code is not more complex and the modules or methods affected are performance critical.
A list of possible cases (there might be more).
| Location | Module / context | Helper |
|---|---|---|
Modules/_csv.c:688 |
csv reader, per field | _PyList_AppendTakeRef |
Modules/pyexpat.c:472 |
pyexpat StartElement, per attribute | _PyDict_SetItem_Take2 |
Modules/_elementtree.c:3351 |
ElementTree C accel attrib dict | _PyDict_SetItem_Take2 |
Modules/_io/bytesio.c:577 |
io.BytesIO.readlines | _PyList_AppendTakeRef |
Modules/_io/iobase.c:756 |
io.IOBase.readlines (generic) | _PyList_AppendTakeRef |
Objects/frameobject.c:639 & 658 |
frame f_locals / vars() / tracing |
_PyList_AppendTakeRef |
Modules/_pickle.c:5138 |
pickle Pickler memo copy | _PyDict_SetItem_Take2 |
Modules/_io/textio.c:2337 & 2343 |
io.TextIOWrapper readline (multi-chunk) | _PyList_AppendTakeRef |
Modules/_asynciomodule.c:1213 |
asyncio future done-callback compaction | _PyList_AppendTakeRef |
Update: Most cases already have an open PR, for new ones please open a separate issue.
Linked PRs
- gh-150943
- gh-150945
- gh-150995
- gh-151002
- gh-151062
- gh-151209
- gh-151608
- gh-153013
- gh-154860
- gh-155171
- gh-155304
- gh-155922
- gh-155940
- gh-155957
- gh-156055
- gh-156199
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Esamina le posizioni C elencate, incluse Modules/_csv.c, Modules/pyexpat.c, Modules/_elementtree.c e i file di _io, Objects, _pickle e _asynciomodule. Controlla prima le PR collegate per vedere quali casi sono già coperti; il lavoro rimanente deve essere suddiviso in una issue separata e circoscritta, con test delle prestazioni pertinenti. Il lavoro è completato quando un caso selezionato e critico per le prestazioni viene modificato senza aggiungere complessità e il suo comportamento e le sue prestazioni vengono verificati.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- c, python
- Ambito
- backend
- Tipo di issue
- Funzionalità
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Da chiarire
- Idoneità per principianti
- 25/100