Skip to content

Instantly share code, notes, and snippets.

@smithdc1
Created January 7, 2021 20:04
Show Gist options
  • Save smithdc1/8813702bcf2a68cc269adaf59bd86b18 to your computer and use it in GitHub Desktop.
Save smithdc1/8813702bcf2a68cc269adaf59bd86b18 to your computer and use it in GitHub Desktop.
Benchmark Django's resolve()
import pyperf
import django
from django.conf import settings
from django.urls import re_path, resolve
settings.configure(ROOT_URLCONF=__name__)
django.setup()
# views
def basic():
pass
def catchall():
pass
def vars(var=None):
pass
# urls
def generate_filler_patterns(num=1):
""" Returns a list of url pattern inputs for garbage views """
for n in range(num):
yield re_path(r"".join((r"^", r"x" * 3 * n, r"/$")), basic)
urlpatterns = list(generate_filler_patterns(10))
urlpatterns.append(re_path(r"^basic/$", basic, name="basic"))
urlpatterns.append(re_path(r"^[a-z]*/$", catchall, name="catchall"))
urlpatterns.append(re_path(r"^replace/(?P<var>.*?)", vars, name="vars"))
def python_cache(loops):
range_it = range(loops)
t0 = pyperf.perf_counter()
# repeat to reduce impact of for loop
for loop in range_it:
resolve("/basic/")
resolve("/basic/")
resolve("/basic/")
resolve("/fallthroughview/")
resolve("/fallthroughview/")
resolve("/fallthroughview/")
resolve("/replace/1")
resolve("/replace/1")
resolve("/replace/1")
return pyperf.perf_counter() - t0
runner = pyperf.Runner()
runner.bench_time_func("Python Cache", python_cache)
@smithdc1
Copy link
Author

smithdc1 commented Jan 7, 2021

New

python bench_resolve.py
.....................
Python Cache: Mean +- std dev: 867 us +- 9 us

Old

python bench_resolve.py
.....................
Python Cache: Mean +- std dev: 933 us +- 7 us

c.7% faster

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment