Improve performance of dataclasses.asdict by caching field names
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 77.2k
- Forks
- 36k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
Feature or enhancement
Proposal:
About 8 years ago @ericvsmith asked:
By caching the field names of a dataclass on the class the performance improves:
asdict: Mean +- std dev: [main] 2.33 us +- 0.14 us -> [pr] 1.65 us +- 0.08 us: 1.41x faster
astuple: Mean +- std dev: [main] 2.77 us +- 0.15 us -> [pr] 2.15 us +- 0.09 us: 1.29x faster
f.__getstate__(): Mean +- std dev: [main] 941 ns +- 64 ns -> [pr] 360 ns +- 18 ns: 2.61x faster
Benchmark hidden because not significant (1): instance creation
Geometric mean: 1.47x faster
Test script
(executed on non-pgo build)
import pyperf
setup = """
from dataclasses import dataclass, asdict, astuple
from pickle import dumps
@dataclass
class Simple:
i : int
s : str
l : list
s = Simple(10, 'hi', [3, 1, 4, 1])
@dataclass(frozen=True, slots=True)
class Frozen:
i : int
s : str
l : list
f = Frozen(10, 'hi', [3, 1, 4, 1])
f.__getstate__()
"""
runner = pyperf.Runner()
runner.timeit(name="instance creation", stmt="Simple(10, 'hi', [3, 1, 4, 1])", setup=setup)
runner.timeit(name="asdict", stmt="asdict(s)", setup=setup)
runner.timeit(name="astuple", stmt="astuple(s)", setup=setup)
runner.timeit(name="f.__getstate__()", stmt="f.__getstate__()", setup=setup)
The main downside of caching the field names is that (per dataclass, not per instance) we have an additional private field on the class with a list of strings.
Has this already been discussed elsewhere?
No response given
Links to previous discussion of this feature:
No response
Linked PRs
- gh-138233
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza revisando Lib/dataclasses.py alrededor de la implementación de asdict y astuple; después inspecciona el PR vinculado gh-138233 antes de hacer cualquier trabajo. Ejecuta el script de pyperf proporcionado para establecer la línea base indicada; la implementación debe conservar el comportamiento de dataclass y, al mismo tiempo, lograr la mejora de rendimiento propuesta mediante el almacenamiento en caché de los nombres de los campos.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- performance
- Tipo de issue
- Nueva funcionalidad
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 25/100