﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
34521	Use __slots__ for template Node classes	Adam Johnson	Adam Johnson	"Declaring __slots__ reduces the memory footprint of a class, and can lead to performance gains due to less data fetching by the CPU.

#12826 proposed adding __slots__ to many classes but was closed with the proposal to do so on a case-by-case basis.

#33474 added __slots__ to `Variable` and related classes, showing memory reductions and performance gains.

I propose adding __slots__ to more template classes to further save memory (Template, Token, Lexer, and the Node classes). This change leads to 1-2% improvement in template rendering time, using this benchmark script:

{{{
import django
from django.conf import settings
from django.template import Context
from django.template import Template

settings.configure(
    TEMPLATES=[{""BACKEND"": ""django.template.backends.django.DjangoTemplates""}]
)
django.setup()

template = Template(""{% if x %}{{ x }}{% endif %}"" * 1_000)
context = Context({""x"": ""abc""})
for i in range(1_000):
    template.render(context)
}}}

And invoking [hyperfine](https://github.com/sharkdp/hyperfine) like so, with Python 3.11.2:

{{{
$ hyperfine \
  -N --warmup 1 \
  --prepare 'git switch -d 7d0e566208' \
  'python benchmark.py' \
  --prepare 'git switch ticket_34521_optimize_templates' \
  'python benchmark.py'
Benchmark 1: python benchmark.py
  Time (mean ± σ):      2.028 s ±  0.042 s    [User: 1.990 s, System: 0.035 s]
  Range (min … max):    1.997 s …  2.116 s    10 runs

Benchmark 2: python benchmark.py
  Time (mean ± σ):      1.985 s ±  0.007 s    [User: 1.950 s, System: 0.033 s]
  Range (min … max):    1.976 s …  1.997 s    10 runs

Summary
  'python benchmark.py' ran
    1.02 ± 0.02 times faster than 'python benchmark.py'
}}}

(I decided not to use djangobench since it's not well maintained, and doesn't do such great stats as hyperfine.)
"	Cleanup/optimization	new	Template system	dev	Normal			Keryn Knight Carlton Gibson	Accepted	1	0	0	1	0	0
