#34521: Use __slots__ for template Node classes
------------------------------------------------+------------------------
Reporter: Adam Johnson | Owner: nobody
Type: Cleanup/optimization | Status: new
Component: Template system | Version: dev
Severity: Normal | Keywords:
Triage Stage: Unreviewed | Has patch: 1
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
------------------------------------------------+------------------------
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 all template Node classes to save further
memory. This leads to about a 1% 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:
{{{
$ hyperfine \
-N --warmup 1 \
--prepare 'git switch -d 7d0e566208' \
'python benchmark.py' \
--prepare 'git switch optimize_templates' \
'python benchmark.py'
Benchmark 1: python benchmark.py
Time (mean ± σ): 2.006 s ± 0.007 s [User: 1.968 s, System:
0.035 s]
Range (min … max): 1.995 s … 2.013 s 10 runs
Benchmark 2: python benchmark.py
Time (mean ± σ): 1.993 s ± 0.008 s [User: 1.958 s, System:
0.034 s]
Range (min … max): 1.984 s … 2.012 s 10 runs
Summary
'python benchmark.py' ran
1.01 ± 0.01 times faster than 'python benchmark.py'
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/34521>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/01070187c174ecb8-2800afec-d8ee-411e-a364-0d0a85568d16-000000%40eu-central-1.amazonses.com.