Skip to content

Instantly share code, notes, and snippets.

@smithdc1
Last active July 6, 2021 19:26
Show Gist options
  • Save smithdc1/0659b5eec593e0160568a4d71ceb0019 to your computer and use it in GitHub Desktop.
Save smithdc1/0659b5eec593e0160568a4d71ceb0019 to your computer and use it in GitHub Desktop.
A benchmark for crispy-forms
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