Last active
July 6, 2021 19:26
-
-
Save smithdc1/0659b5eec593e0160568a4d71ceb0019 to your computer and use it in GitHub Desktop.
A benchmark for crispy-forms
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import pyperf | |
import django | |
from django.conf import settings | |
from django.forms import CharField, FloatField, Form, HiddenInput, IntegerField | |
from django.template.base import Template | |
from django.template.context import Context | |
from django.utils.functional import SimpleLazyObject | |
from crispy_forms.helper import FormHelper | |
from crispy_forms.layout import Div, Layout | |
def urls(): | |
from django.contrib import admin | |
from django.urls import path | |
return (path("admin", admin.site.urls),) | |
settings.configure( | |
INSTALLED_APPS=( | |
"__main__", | |
"crispy_forms", | |
"django.contrib.contenttypes", | |
"django.contrib.auth", | |
"django.contrib.admin", | |
), | |
SECRET_KEY="notasecret", | |
ROOT_URLCONF=SimpleLazyObject(urls), | |
TEMPLATES=[ | |
{ | |
"BACKEND": "django.template.backends.django.DjangoTemplates", | |
"DIRS": [], | |
"APP_DIRS": True, | |
"OPTIONS": { | |
"context_processors": [ | |
"django.template.context_processors.request", | |
"django.contrib.auth.context_processors.auth", | |
"django.contrib.messages.context_processors.messages", | |
], | |
}, | |
}, | |
], | |
) | |
django.setup() | |
class ExampleForm(Form): | |
"""To be used for a formset""" | |
field_1 = CharField(required=True, min_length=1, widget=HiddenInput()) | |
field_2 = CharField(required=True, min_length=1, widget=HiddenInput()) | |
field_3 = CharField(required=False, min_length=10, max_length=12) | |
field_4 = CharField(required=False, min_length=10, max_length=16) | |
field_5 = IntegerField(required=True) | |
field_6 = IntegerField(required=False) | |
field_7 = CharField(required=False, max_length=1, label="D/F") | |
field_8 = CharField(required=False, max_length=12) | |
field_9 = IntegerField(required=False) | |
field_10 = FloatField(required=False, min_value=0) | |
field_11 = FloatField(required=False, min_value=0) | |
field_12 = CharField(required=False, disabled=True, min_length=1, max_length=1000) | |
class ExampleFormHelper(FormHelper): | |
def __init__(self, *args, **kwargs): | |
super().__init__(*args, **kwargs) | |
self.form_method = "post" | |
self.form_show_labels = False | |
self.form_tag = False | |
self.layout = Layout( | |
Div( | |
Div( | |
"field_1", | |
"field_2", | |
"field_3", | |
css_class="col", | |
), | |
Div( | |
"field_4", | |
css_class="col", | |
), | |
Div( | |
"field_5", | |
css_class="col", | |
), | |
Div( | |
"field_6", | |
css_class="col", | |
), | |
Div( | |
"field_7", | |
css_class="col", | |
), | |
Div( | |
"field_8", | |
css_class="col", | |
), | |
Div( | |
"field_9", | |
css_class="col", | |
), | |
Div( | |
"field_10", | |
css_class="col", | |
), | |
Div( | |
"field_11", | |
css_class="col", | |
), | |
css_class="row", | |
), | |
Div(Div("field_12", css_class="col-12"), css_class="row"), | |
) | |
self.render_required_fields = True | |
def form(loops): | |
template = Template( | |
""" | |
{{form}} | |
""" | |
) | |
f = ExampleForm() | |
range_it = range(loops) | |
t0 = pyperf.perf_counter() | |
for loops in range_it: | |
template.render(Context({"form": f})) | |
template.render(Context({"form": f})) | |
template.render(Context({"form": f})) | |
template.render(Context({"form": f})) | |
template.render(Context({"form": f})) | |
template.render(Context({"form": f})) | |
template.render(Context({"form": f})) | |
template.render(Context({"form": f})) | |
template.render(Context({"form": f})) | |
template.render(Context({"form": f})) | |
return pyperf.perf_counter() - t0 | |
def crispy_filter(loops): | |
template = Template( | |
""" | |
{% load crispy_forms_tags %} | |
{{ form|crispy }} | |
""" | |
) | |
f = ExampleForm() | |
range_it = range(loops) | |
t0 = pyperf.perf_counter() | |
for loops in range_it: | |
template.render(Context({"form": f})) | |
template.render(Context({"form": f})) | |
template.render(Context({"form": f})) | |
template.render(Context({"form": f})) | |
template.render(Context({"form": f})) | |
template.render(Context({"form": f})) | |
template.render(Context({"form": f})) | |
template.render(Context({"form": f})) | |
template.render(Context({"form": f})) | |
template.render(Context({"form": f})) | |
return pyperf.perf_counter() - t0 | |
def crispy_form(loops): | |
template = Template( | |
""" | |
{% load crispy_forms_tags %} | |
{% crispy form form_helper %} | |
""" | |
) | |
f = ExampleForm() | |
range_it = range(loops) | |
t0 = pyperf.perf_counter() | |
for loops in range_it: | |
template.render(Context({"form": f, "form_helper": ExampleFormHelper()})) | |
template.render(Context({"form": f, "form_helper": ExampleFormHelper()})) | |
template.render(Context({"form": f, "form_helper": ExampleFormHelper()})) | |
template.render(Context({"form": f, "form_helper": ExampleFormHelper()})) | |
template.render(Context({"form": f, "form_helper": ExampleFormHelper()})) | |
template.render(Context({"form": f, "form_helper": ExampleFormHelper()})) | |
template.render(Context({"form": f, "form_helper": ExampleFormHelper()})) | |
template.render(Context({"form": f, "form_helper": ExampleFormHelper()})) | |
template.render(Context({"form": f, "form_helper": ExampleFormHelper()})) | |
template.render(Context({"form": f, "form_helper": ExampleFormHelper()})) | |
return pyperf.perf_counter() - t0 | |
runner = pyperf.Runner() | |
runner.bench_time_func("form", form) | |
runner.bench_time_func("crispy_filter", crispy_filter) | |
runner.bench_time_func("crispy_form", crispy_form) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment