# Python ## Version Update Newer versions of python can focus heavily on performance improvements, some more than others. But be aware regressions for stability or security reasons may always be the case. As a general rule, Python 3.9 and Python 3.11 both had a strong focus on performance improvements. Python 3.12 is looking promising but has yet to have widespread testing, adoption and deployment. A simple comparison is available at [speed.python.org](https://speed.python.org/comparison/?exe=12%2BL%2B3.11%2C12%2BL%2B3.12%2C12%2BL%2B3.10%2C12%2BL%2B3.9%2C12%2BL%2B3.8&ben=746&env=1&hor=false&bas=none&chart=normal+bars). [Djangobench](https://github.com/django/djangobench/tree/master) is the source of synthetic benchmarks and a useful tool for running comparisons. Below are some examples to inform your investigations. Keep in mind while a 1.2x faster result is significant, it's only one step of the process, Celery, SQL, Redis, and many other factors will influence the end result, and this _python_ speed improvement will not translate 1:1 into real world performance. ### Running Djangobench ```bash python3.8 -m venv py38 python3.11 -m venv py311 pip install -e git://github.com/django/djangobench.git#egg=djangobench git clone https://github.com/django/django.git cd django djangobench --control=x --experiment=x --control-python=x --experiment-python=x -r /home/ozira/djangobench/results -t 500 ``` ### Django 4.2.13 Py38 v Py311 - Djangobench 0.10.0 - Django 4.2.13 - Python 3.8.19 vs Python 3.11.5 ```bash python3.8 -m venv py38 python3.11 -m venv py38 pip install -e git://github.com/django/djangobench.git#egg=djangobench git clone https://github.com/django/django.git cd django ozira@METABOX:~/djangobench/django$ djangobench --control=4.2.13 --experiment=4.2.13 --control-python=/home/ozira/djangobench/py38/bin/python --experiment-python=/home/ozira/djangobench/py311/bin/python -r /home/ozira/djangobench/results -t 500 Running all benchmarks Recording data to '/home/ozira/djangobench/results' Control: Django 4.2 (in git branch 4.2) Experiment: Django 4.2 (in git branch 4.2) Running 'multi_value_dict' benchmark ... Min: 0.000016 -> 0.000014: 1.1215x faster Avg: 0.000212 -> 0.000158: 1.3378x faster Significant (t=8.313771) Stddev: 0.00012 -> 0.00008: 1.3703x smaller (N = 500) Running 'query_values' benchmark ... Min: 0.000096 -> 0.000083: 1.1540x faster Avg: 0.000100 -> 0.000087: 1.1391x faster Significant (t=20.039719) Stddev: 0.00001 -> 0.00001: 1.0402x smaller (N = 500) Running 'query_delete' benchmark ... Min: 0.000089 -> 0.000077: 1.1555x faster Avg: 0.000094 -> 0.000082: 1.1492x faster Significant (t=24.020715) Stddev: 0.00001 -> 0.00001: 1.0738x smaller (N = 500) Running 'query_select_related' benchmark ... Min: 0.021098 -> 0.017898: 1.1788x faster Avg: 0.027279 -> 0.019895: 1.3712x faster Significant (t=31.103306) Stddev: 0.00486 -> 0.00213: 2.2832x smaller (N = 500) Running 'query_aggregate' benchmark ... Min: 0.000162 -> 0.000140: 1.1626x faster Avg: 0.000184 -> 0.000153: 1.2025x faster Significant (t=20.672411) Stddev: 0.00003 -> 0.00002: 1.2643x smaller (N = 500) Running 'query_raw_deferred' benchmark ... Min: 0.005456 -> 0.004688: 1.1637x faster Avg: 0.006070 -> 0.005151: 1.1786x faster Significant (t=10.912514) Stddev: 0.00155 -> 0.00107: 1.4503x smaller (N = 500) Running 'query_get_or_create' benchmark ... Min: 0.000526 -> 0.000457: 1.1526x faster Avg: 0.000597 -> 0.000546: 1.0946x faster Significant (t=7.469654) Stddev: 0.00010 -> 0.00012: 1.1192x larger (N = 500) Running 'query_values_list' benchmark ... Min: 0.000102 -> 0.000090: 1.1403x faster Avg: 0.000113 -> 0.000096: 1.1733x faster Significant (t=13.975856) Stddev: 0.00002 -> 0.00001: 2.0715x smaller (N = 500) Running 'url_resolve_flat_i18n_off' benchmark ... Min: 0.069399 -> 0.058137: 1.1937x faster Avg: 0.074039 -> 0.064810: 1.1424x faster Significant (t=21.837249) Stddev: 0.00341 -> 0.00881: 2.5880x larger (N = 500) Running 'qs_filter_chaining' benchmark ... Min: 0.000304 -> 0.000263: 1.1583x faster Avg: 0.000321 -> 0.000281: 1.1424x faster Significant (t=15.363420) Stddev: 0.00003 -> 0.00005: 1.8538x larger (N = 500) Running 'template_render' benchmark ... Min: 0.001211 -> 0.000970: 1.2490x faster Avg: 0.001471 -> 0.001360: 1.0816x faster Significant (t=2.688854) Stddev: 0.00067 -> 0.00064: 1.0463x smaller (N = 500) Running 'query_get' benchmark ... Min: 0.000340 -> 0.000295: 1.1554x faster Avg: 0.000382 -> 0.000324: 1.1797x faster Significant (t=26.055010) Stddev: 0.00004 -> 0.00003: 1.5530x smaller (N = 500) Running 'query_none' benchmark ... Min: 0.000082 -> 0.000074: 1.1133x faster Avg: 0.000089 -> 0.000081: 1.0934x faster Significant (t=2.334959) Stddev: 0.00005 -> 0.00005: 1.0667x larger (N = 500) Running 'query_complex_filter' benchmark ... Min: 0.000050 -> 0.000053: 1.0480x slower Avg: 0.000055 -> 0.000058: 1.0495x slower Significant (t=-3.073848) Stddev: 0.00001 -> 0.00001: 1.0593x larger (N = 500) Running 'query_filter' benchmark ... Min: 0.000169 -> 0.000157: 1.0758x faster Avg: 0.000186 -> 0.000173: 1.0756x faster Significant (t=9.677659) Stddev: 0.00002 -> 0.00002: 1.0462x smaller (N = 500) Running 'template_render_simple' benchmark ... Min: 0.000039 -> 0.000034: 1.1694x faster Avg: 0.000046 -> 0.000040: 1.1437x faster Not significant Stddev: 0.00010 -> 0.00008: 1.2071x smaller (N = 500) Running 'default_middleware' benchmark ... Min: -0.000061 -> -0.000088: 0.6901x faster Avg: 0.000002 -> 0.000001: 2.1933x faster Not significant Stddev: 0.00003 -> 0.00002: 1.5573x smaller (N = 500) Running 'query_annotate' benchmark ... Min: 0.000237 -> 0.000216: 1.0986x faster Avg: 0.000279 -> 0.000252: 1.1089x faster Significant (t=9.006132) Stddev: 0.00006 -> 0.00004: 1.6353x smaller (N = 500) Running 'raw_sql' benchmark ... Min: 0.000021 -> 0.000014: 1.4549x faster Avg: 0.000022 -> 0.000015: 1.4636x faster Significant (t=30.661315) Stddev: 0.00000 -> 0.00000: 2.1050x smaller (N = 500) Running 'url_resolve_flat' benchmark ... Min: 0.069107 -> 0.056678: 1.2193x faster Avg: 0.076299 -> 0.066199: 1.1526x faster Significant (t=16.072616) Stddev: 0.00711 -> 0.01212: 1.7039x larger (N = 500) Running 'l10n_render' benchmark ... Min: 0.002025 -> 0.001557: 1.3009x faster Avg: 0.002215 -> 0.001671: 1.3258x faster Significant (t=23.802622) Stddev: 0.00045 -> 0.00025: 1.7786x smaller (N = 500) Running 'query_count' benchmark ... Min: 0.000145 -> 0.000130: 1.1209x faster Avg: 0.000165 -> 0.000148: 1.1163x faster Significant (t=6.919972) Stddev: 0.00005 -> 0.00003: 1.5444x smaller (N = 500) Running 'model_delete' benchmark ... Min: 0.000148 -> 0.000123: 1.2062x faster Avg: 0.000172 -> 0.000138: 1.2410x faster Significant (t=27.181750) Stddev: 0.00002 -> 0.00002: 1.1414x smaller (N = 500) Running 'query_iterator' benchmark ... Min: 0.000189 -> 0.000109: 1.7400x faster Avg: 0.000208 -> 0.000118: 1.7557x faster Significant (t=49.768122) Stddev: 0.00003 -> 0.00002: 1.5989x smaller (N = 500) Running 'template_compilation' benchmark ... Min: 0.000206 -> 0.000173: 1.1888x faster Avg: 0.000223 -> 0.000219: 1.0169x faster Not significant Stddev: 0.00011 -> 0.00011: 1.0781x smaller (N = 500) Running 'query_all_multifield' benchmark ... Min: 0.018550 -> 0.015556: 1.1925x faster Avg: 0.021732 -> 0.017870: 1.2161x faster Significant (t=17.544643) Stddev: 0.00371 -> 0.00324: 1.1438x smaller (N = 500) Running 'query_prefetch_related' benchmark ... Min: 0.017945 -> 0.015631: 1.1480x faster Avg: 0.021111 -> 0.018532: 1.1391x faster Significant (t=12.174441) Stddev: 0.00352 -> 0.00316: 1.1143x smaller (N = 500) Running 'query_all_converters' benchmark ... Min: 0.000639 -> 0.000543: 1.1774x faster Avg: 0.000693 -> 0.000583: 1.1878x faster Significant (t=32.728842) Stddev: 0.00004 -> 0.00006: 1.4338x larger (N = 500) Running 'query_distinct' benchmark ... Min: 0.000132 -> 0.000138: 1.0442x slower Avg: 0.000138 -> 0.000149: 1.0834x slower Significant (t=-11.713427) Stddev: 0.00002 -> 0.00002: 1.0455x larger (N = 500) Running 'query_dates' benchmark ... Min: 0.000426 -> 0.000372: 1.1440x faster Avg: 0.000479 -> 0.000430: 1.1135x faster Significant (t=15.165974) Stddev: 0.00005 -> 0.00006: 1.2095x larger (N = 500) Running 'model_save_existing' benchmark ... Min: 0.004182 -> 0.003730: 1.1212x faster Avg: 0.004460 -> 0.004028: 1.1073x faster Significant (t=33.972394) Stddev: 0.00019 -> 0.00021: 1.0838x larger (N = 500) Running 'query_delete_related' benchmark ... Min: 0.000140 -> 0.000126: 1.1047x faster Avg: 0.000159 -> 0.000143: 1.1088x faster Significant (t=3.361755) Stddev: 0.00006 -> 0.00009: 1.4858x larger (N = 500) Running 'url_reverse' benchmark ... Min: 0.000072 -> 0.000099: 1.3810x slower Avg: 0.000104 -> 0.000112: 1.0749x slower Not significant Stddev: 0.00033 -> 0.00008: 3.9995x smaller (N = 500) Running 'query_latest' benchmark ... Min: 0.000177 -> 0.000150: 1.1805x faster Avg: 0.000199 -> 0.000167: 1.1891x faster Significant (t=16.579351) Stddev: 0.00003 -> 0.00003: 1.2223x smaller (N = 500) Running 'form_create' benchmark ... Min: 0.000018 -> 0.000015: 1.1897x faster Avg: 0.000024 -> 0.000018: 1.3592x faster Significant (t=4.264451) Stddev: 0.00003 -> 0.00002: 1.3397x smaller (N = 500) Running 'query_update' benchmark ... Min: 0.000062 -> 0.000047: 1.3306x faster Avg: 0.000067 -> 0.000053: 1.2660x faster Significant (t=25.960527) Stddev: 0.00001 -> 0.00001: 1.2136x larger (N = 500) Running 'query_in_bulk' benchmark ... Min: 0.000196 -> 0.000183: 1.0695x faster Avg: 0.000238 -> 0.000212: 1.1222x faster Significant (t=9.208556) Stddev: 0.00005 -> 0.00004: 1.0293x smaller (N = 500) Running 'url_resolve_nested' benchmark ... Min: 0.000058 -> 0.000047: 1.2381x faster Avg: 0.000094 -> 0.000060: 1.5585x faster Not significant Stddev: 0.00047 -> 0.00020: 2.2921x smaller (N = 500) Running 'model_creation' benchmark ... Min: 0.000086 -> 0.000071: 1.2232x faster Avg: 0.000096 -> 0.000080: 1.1972x faster Significant (t=5.528555) Stddev: 0.00004 -> 0.00005: 1.1460x larger (N = 500) Running 'query_order_by' benchmark ... Min: 0.000180 -> 0.000153: 1.1761x faster Avg: 0.000192 -> 0.000168: 1.1406x faster Significant (t=14.472948) Stddev: 0.00002 -> 0.00003: 1.0888x larger (N = 500) Running 'startup' benchmark ... Skipped: Django 1.9 and later has changed app loading. This benchmark needs fixing anyway. Running 'form_clean' benchmark ... Min: 0.000006 -> 0.000005: 1.2056x faster Avg: 0.000006 -> 0.000006: 1.1728x faster Significant (t=5.893457) Stddev: 0.00000 -> 0.00000: 1.4504x larger (N = 500) Running 'locale_from_request' benchmark ... Min: 0.000122 -> 0.000113: 1.0747x faster Avg: 0.000130 -> 0.000119: 1.0879x faster Significant (t=2.108857) Stddev: 0.00009 -> 0.00007: 1.2298x smaller (N = 500) Running 'query_exists' benchmark ... Min: 0.000411 -> 0.000351: 1.1700x faster Avg: 0.000472 -> 0.000406: 1.1616x faster Significant (t=20.906891) Stddev: 0.00005 -> 0.00004: 1.2381x smaller (N = 500) Running 'query_values_10000' benchmark ... Min: 0.006930 -> 0.006720: 1.0312x faster Avg: 0.008118 -> 0.007403: 1.0966x faster Significant (t=8.797671) Stddev: 0.00137 -> 0.00119: 1.1526x smaller (N = 500) Running 'query_exclude' benchmark ... Min: 0.000197 -> 0.000166: 1.1884x faster Avg: 0.000220 -> 0.000183: 1.2010x faster Significant (t=22.491738) Stddev: 0.00003 -> 0.00002: 1.2009x smaller (N = 500) Running 'query_raw' benchmark ... Min: 0.006850 -> 0.005836: 1.1739x faster Avg: 0.007724 -> 0.006518: 1.1851x faster Significant (t=13.372258) Stddev: 0.00168 -> 0.00111: 1.5089x smaller (N = 500) Running 'url_resolve' benchmark ... Min: 0.006464 -> 0.005129: 1.2602x faster Avg: 0.006980 -> 0.005578: 1.2512x faster Significant (t=62.894242) Stddev: 0.00044 -> 0.00023: 1.8763x smaller (N = 500) Running 'model_save_new' benchmark ... Min: 0.004156 -> 0.003608: 1.1519x faster Avg: 0.004399 -> 0.003921: 1.1220x faster Significant (t=31.848867) Stddev: 0.00022 -> 0.00026: 1.1820x larger (N = 500) Running 'query_all' benchmark ... Min: 0.009951 -> 0.008729: 1.1399x faster Avg: 0.011392 -> 0.010135: 1.1240x faster Significant (t=7.913017) Stddev: 0.00257 -> 0.00246: 1.0449x smaller (N = 500) ``` ### Django 4.2.13 Py311 v Py312 - Djangobench 0.10.0 - Django 4.2.13 - Python 3.11.9 vs Python 3.12.3 ```bash python3.8 -m venv py38 python3.11 -m venv py38 pip install -e git://github.com/django/djangobench.git#egg=djangobench git clone https://github.com/django/django.git cd django ozira@METABOX:~/djangobench/django$ djangobench --control=4.2.13 --experiment=4.2.13 --control-python=/home/ozira/djangobench/py311/bin/python --experiment-python=/home/ozira/djangobench/py312/bin/python -r /home/ozira/djangobench/results -t 500 Running all benchmarks Recording data to '/home/ozira/djangobench/results' Control: Django 4.2.13 (in git branch 4.2.13) Experiment: Django 4.2.13 (in git branch 4.2.13) Running 'multi_value_dict' benchmark ... Min: 0.000015 -> 0.000012: 1.2159x faster Avg: 0.000153 -> 0.000145: 1.0567x faster Not significant Stddev: 0.00008 -> 0.00008: 1.0399x smaller (N = 500) Running 'query_values' benchmark ... Min: 0.000080 -> 0.000074: 1.0884x faster Avg: 0.000086 -> 0.000080: 1.0848x faster Significant (t=9.315400) Stddev: 0.00001 -> 0.00001: 1.3002x larger (N = 500) Running 'query_delete' benchmark ... Min: 0.000076 -> 0.000073: 1.0437x faster Avg: 0.000082 -> 0.000078: 1.0473x faster Significant (t=6.287296) Stddev: 0.00001 -> 0.00001: 1.2237x smaller (N = 500) Running 'query_select_related' benchmark ... Min: 0.015799 -> 0.015198: 1.0395x faster Avg: 0.017664 -> 0.016664: 1.0600x faster Significant (t=12.493385) Stddev: 0.00129 -> 0.00124: 1.0404x smaller (N = 500) Running 'query_aggregate' benchmark ... Min: 0.000180 -> 0.000170: 1.0605x faster Avg: 0.000196 -> 0.000202: 1.0290x slower Significant (t=-3.095949) Stddev: 0.00002 -> 0.00003: 1.6034x larger (N = 500) Running 'query_raw_deferred' benchmark ... Min: 0.004605 -> 0.003799: 1.2122x faster Avg: 0.005051 -> 0.004491: 1.1246x faster Significant (t=7.096110) Stddev: 0.00099 -> 0.00146: 1.4821x larger (N = 500) Running 'query_get_or_create' benchmark ... Min: 0.000407 -> 0.000441: 1.0838x slower Avg: 0.000467 -> 0.000504: 1.0794x slower Significant (t=-6.031826) Stddev: 0.00009 -> 0.00010: 1.1220x larger (N = 500) Running 'query_values_list' benchmark ... Min: 0.000079 -> 0.000078: 1.0091x faster Avg: 0.000085 -> 0.000085: 1.0028x slower Not significant Stddev: 0.00001 -> 0.00001: 1.5801x larger (N = 500) Running 'url_resolve_flat_i18n_off' benchmark ... Min: 0.054191 -> 0.052512: 1.0320x faster Avg: 0.062988 -> 0.056872: 1.1075x faster Significant (t=14.068836) Stddev: 0.00854 -> 0.00465: 1.8373x smaller (N = 500) Running 'qs_filter_chaining' benchmark ... Min: 0.000253 -> 0.000233: 1.0868x faster Avg: 0.000274 -> 0.000251: 1.0890x faster Significant (t=12.292236) Stddev: 0.00003 -> 0.00003: 1.2192x smaller (N = 500) Running 'template_render' benchmark ... Min: 0.000882 -> 0.000826: 1.0679x faster Avg: 0.001003 -> 0.000906: 1.1072x faster Significant (t=3.338298) Stddev: 0.00054 -> 0.00036: 1.5250x smaller (N = 500) Running 'query_get' benchmark ... Min: 0.000280 -> 0.000263: 1.0631x faster Avg: 0.000303 -> 0.000292: 1.0373x faster Significant (t=6.991086) Stddev: 0.00002 -> 0.00002: 1.0173x smaller (N = 500) Running 'query_none' benchmark ... Min: 0.000052 -> 0.000050: 1.0482x faster Avg: 0.000058 -> 0.000056: 1.0345x faster Not significant Stddev: 0.00003 -> 0.00006: 1.9705x larger (N = 500) Running 'query_complex_filter' benchmark ... Min: 0.000038 -> 0.000035: 1.0815x faster Avg: 0.000040 -> 0.000037: 1.0691x faster Significant (t=10.690955) Stddev: 0.00000 -> 0.00000: 1.3311x larger (N = 500) Running 'query_filter' benchmark ... Min: 0.000141 -> 0.000176: 1.2429x slower Avg: 0.000156 -> 0.000216: 1.3882x slower Significant (t=-42.392024) Stddev: 0.00002 -> 0.00003: 1.8049x larger (N = 500) Running 'template_render_simple' benchmark ... Min: 0.000030 -> 0.000036: 1.2122x slower Avg: 0.000035 -> 0.000045: 1.2980x slower Significant (t=-2.068415) Stddev: 0.00007 -> 0.00009: 1.3543x larger (N = 500) Running 'default_middleware' benchmark ... Min: -0.000159 -> -0.000214: 0.7434x faster Avg: 0.000001 -> 0.000001: 1.1672x faster Not significant Stddev: 0.00002 -> 0.00002: 1.1005x larger (N = 500) Running 'query_annotate' benchmark ... Min: 0.000204 -> 0.000198: 1.0298x faster Avg: 0.000226 -> 0.000236: 1.0459x slower Significant (t=-4.509109) Stddev: 0.00003 -> 0.00004: 1.5714x larger (N = 500) Running 'raw_sql' benchmark ... Min: 0.000018 -> 0.000013: 1.3404x faster Avg: 0.000019 -> 0.000015: 1.3195x faster Significant (t=19.789629) Stddev: 0.00000 -> 0.00000: 1.3561x smaller (N = 500) Running 'url_resolve_flat' benchmark ... Min: 0.055935 -> 0.053402: 1.0474x faster Avg: 0.062895 -> 0.059771: 1.0523x faster Significant (t=7.194834) Stddev: 0.00723 -> 0.00648: 1.1147x smaller (N = 500) Running 'l10n_render' benchmark ... Min: 0.001529 -> 0.001251: 1.2219x faster Avg: 0.001611 -> 0.001377: 1.1701x faster Significant (t=18.793991) Stddev: 0.00018 -> 0.00021: 1.1812x larger (N = 500) Running 'query_count' benchmark ... Min: 0.000205 -> 0.000190: 1.0786x faster Avg: 0.000230 -> 0.000223: 1.0340x faster Significant (t=3.666845) Stddev: 0.00003 -> 0.00004: 1.3467x larger (N = 500) Running 'model_delete' benchmark ... Min: 0.000125 -> 0.000115: 1.0868x faster Avg: 0.000146 -> 0.000135: 1.0808x faster Significant (t=7.537652) Stddev: 0.00003 -> 0.00002: 1.4769x smaller (N = 500) Running 'query_iterator' benchmark ... Min: 0.000110 -> 0.000097: 1.1344x faster Avg: 0.000116 -> 0.000103: 1.1269x faster Significant (t=19.477018) Stddev: 0.00001 -> 0.00001: 1.0328x larger (N = 500) Running 'template_compilation' benchmark ... Min: 0.000157 -> 0.000157: 1.0038x faster Avg: 0.000173 -> 0.000169: 1.0255x faster Not significant Stddev: 0.00008 -> 0.00008: 1.0180x smaller (N = 500) Running 'query_all_multifield' benchmark ... Min: 0.014928 -> 0.014535: 1.0270x faster Avg: 0.017357 -> 0.016710: 1.0387x faster Significant (t=3.854898) Stddev: 0.00263 -> 0.00268: 1.0198x larger (N = 500) Running 'query_prefetch_related' benchmark ... Min: 0.014613 -> 0.013929: 1.0491x faster Avg: 0.016610 -> 0.016188: 1.0261x faster Significant (t=2.746974) Stddev: 0.00236 -> 0.00250: 1.0569x larger (N = 500) Running 'query_all_converters' benchmark ... Min: 0.000525 -> 0.000493: 1.0659x faster Avg: 0.000604 -> 0.000527: 1.1458x faster Significant (t=24.506675) Stddev: 0.00006 -> 0.00004: 1.7192x smaller (N = 500) Running 'query_distinct' benchmark ... Min: 0.000150 -> 0.000181: 1.2049x slower Avg: 0.000159 -> 0.000231: 1.4503x slower Significant (t=-31.080159) Stddev: 0.00002 -> 0.00005: 3.0049x larger (N = 500) Running 'query_dates' benchmark ... Min: 0.000512 -> 0.000402: 1.2740x faster Avg: 0.000677 -> 0.000541: 1.2510x faster Significant (t=18.130874) Stddev: 0.00014 -> 0.00009: 1.5731x smaller (N = 500) Running 'model_save_existing' benchmark ... Min: 0.004219 -> 0.003506: 1.2033x faster Avg: 0.005591 -> 0.004282: 1.3058x faster Significant (t=24.601648) Stddev: 0.00105 -> 0.00056: 1.8802x smaller (N = 500) Running 'query_delete_related' benchmark ... Min: 0.000146 -> 0.000113: 1.2893x faster Avg: 0.000164 -> 0.000125: 1.3116x faster Significant (t=11.903195) Stddev: 0.00006 -> 0.00004: 1.2887x smaller (N = 500) Running 'url_reverse' benchmark ... Min: 0.000083 -> 0.000051: 1.6336x faster Avg: 0.000098 -> 0.000057: 1.7123x faster Significant (t=9.922770) Stddev: 0.00008 -> 0.00005: 1.5293x smaller (N = 500) Running 'query_latest' benchmark ... Min: 0.000171 -> 0.000149: 1.1500x faster Avg: 0.000191 -> 0.000167: 1.1440x faster Significant (t=9.636091) Stddev: 0.00005 -> 0.00003: 1.6181x smaller (N = 500) Running 'form_create' benchmark ... Min: 0.000015 -> 0.000015: 1.0149x slower Avg: 0.000018 -> 0.000018: 1.0134x faster Not significant Stddev: 0.00002 -> 0.00002: 1.0031x smaller (N = 500) Running 'query_update' benchmark ... Min: 0.000048 -> 0.000045: 1.0663x faster Avg: 0.000052 -> 0.000048: 1.0711x faster Significant (t=7.190354) Stddev: 0.00001 -> 0.00001: 1.3463x larger (N = 500) Running 'query_in_bulk' benchmark ... Min: 0.000161 -> 0.000198: 1.2326x slower Avg: 0.000176 -> 0.000269: 1.5247x slower Significant (t=-26.624807) Stddev: 0.00003 -> 0.00007: 2.2105x larger (N = 500) Running 'url_resolve_nested' benchmark ... Min: 0.000063 -> 0.000042: 1.4993x faster Avg: 0.000082 -> 0.000061: 1.3509x faster Not significant Stddev: 0.00027 -> 0.00033: 1.2034x larger (N = 500) Running 'model_creation' benchmark ... Min: 0.000079 -> 0.000074: 1.0644x faster Avg: 0.000089 -> 0.000087: 1.0230x faster Not significant Stddev: 0.00005 -> 0.00008: 1.4667x larger (N = 500) Running 'query_order_by' benchmark ... Min: 0.000179 -> 0.000162: 1.1071x faster Avg: 0.000207 -> 0.000183: 1.1311x faster Significant (t=9.116430) Stddev: 0.00005 -> 0.00003: 1.6620x smaller (N = 500) Running 'startup' benchmark ... Skipped: Django 1.9 and later has changed app loading. This benchmark needs fixing anyway. Running 'form_clean' benchmark ... Min: 0.000005 -> 0.000004: 1.1374x faster Avg: 0.000005 -> 0.000005: 1.1159x faster Significant (t=3.486468) Stddev: 0.00000 -> 0.00000: 1.1186x smaller (N = 500) Running 'locale_from_request' benchmark ... Min: 0.000126 -> 0.000117: 1.0788x faster Avg: 0.000141 -> 0.000130: 1.0820x faster Significant (t=2.168131) Stddev: 0.00008 -> 0.00008: 1.0548x larger (N = 500) Running 'query_exists' benchmark ... Min: 0.000339 -> 0.000270: 1.2522x faster Avg: 0.000390 -> 0.000302: 1.2915x faster Significant (t=32.599092) Stddev: 0.00005 -> 0.00003: 1.6766x smaller (N = 500) Running 'query_values_10000' benchmark ... Min: 0.007119 -> 0.005268: 1.3513x faster Avg: 0.007891 -> 0.006276: 1.2573x faster Significant (t=18.731021) Stddev: 0.00120 -> 0.00151: 1.2516x larger (N = 500) Running 'query_exclude' benchmark ... Min: 0.000181 -> 0.000157: 1.1532x faster Avg: 0.000222 -> 0.000173: 1.2822x faster Significant (t=22.161234) Stddev: 0.00005 -> 0.00002: 2.4379x smaller (N = 500) Running 'query_raw' benchmark ... Min: 0.006000 -> 0.005498: 1.0913x faster Avg: 0.006669 -> 0.006219: 1.0723x faster Significant (t=5.713937) Stddev: 0.00118 -> 0.00130: 1.0984x larger (N = 500) Running 'url_resolve' benchmark ... Min: 0.005204 -> 0.004399: 1.1832x faster Avg: 0.005764 -> 0.004764: 1.2099x faster Significant (t=38.897887) Stddev: 0.00055 -> 0.00018: 3.0723x smaller (N = 500) Running 'model_save_new' benchmark ... Min: 0.003674 -> 0.003351: 1.0967x faster Avg: 0.003917 -> 0.003604: 1.0868x faster Significant (t=21.508370) Stddev: 0.00021 -> 0.00025: 1.2091x larger (N = 500) Running 'query_all' benchmark ... Min: 0.008655 -> 0.008097: 1.0689x faster Avg: 0.010801 -> 0.009255: 1.1669x faster Significant (t=8.961354) Stddev: 0.00304 -> 0.00237: 1.2846x smaller (N = 500) ``` ### Python 3.12.3 Dj4.2 vs Dj5.0 This benchmark is purely for development notes. - Djangobench 0.10.0 - Python 3.12.3 - Django 4.2.13 vs Django 5.0.6 ```bash python3.8 -m venv py38 python3.11 -m venv py38 pip install -e git://github.com/django/djangobench.git#egg=djangobench git clone https://github.com/django/django.git cd django ozira@METABOX:~/djangobench/django$ djangobench --control=4.2.13 --experiment=5.0.6 --control-python=/home/ozira/djangobench/py312/bin/python --experiment-python=/home/ozira/djangobench/py312/bin/python -r /home/ozira/djangobench/results -t 500 Running all benchmarks Recording data to '/home/ozira/djangobench/results' Control: Django 4.2.13 (in git branch 4.2.13) Experiment: Django 5.0.6 (in git branch 5.0.6) Running 'multi_value_dict' benchmark ... Min: 0.000013 -> 0.000023: 1.7898x slower Avg: 0.000159 -> 0.000314: 1.9720x slower Significant (t=-18.448864) Stddev: 0.00009 -> 0.00017: 1.8462x larger (N = 500) Running 'query_values' benchmark ... Min: 0.000086 -> 0.000093: 1.0836x slower Avg: 0.000092 -> 0.000101: 1.1016x slower Significant (t=-13.223024) Stddev: 0.00001 -> 0.00001: 1.2472x larger (N = 500) Running 'query_delete' benchmark ... Min: 0.000098 -> 0.000085: 1.1525x faster Avg: 0.000109 -> 0.000105: 1.0412x faster Significant (t=3.610998) Stddev: 0.00002 -> 0.00002: 1.2485x larger (N = 500) Running 'query_select_related' benchmark ... Min: 0.016080 -> 0.017390: 1.0815x slower Avg: 0.018038 -> 0.020007: 1.1092x slower Significant (t=-10.013539) Stddev: 0.00204 -> 0.00390: 1.9094x larger (N = 500) Running 'query_aggregate' benchmark ... Min: 0.000195 -> 0.000186: 1.0503x faster Avg: 0.000225 -> 0.000210: 1.0729x faster Significant (t=6.534745) Stddev: 0.00004 -> 0.00004: 1.0807x smaller (N = 500) Running 'query_raw_deferred' benchmark ... Min: 0.003904 -> 0.004196: 1.0748x slower Avg: 0.004346 -> 0.004650: 1.0698x slower Significant (t=-4.131647) Stddev: 0.00113 -> 0.00119: 1.0537x larger (N = 500) Running 'query_get_or_create' benchmark ... Min: 0.000447 -> 0.000482: 1.0795x slower Avg: 0.000546 -> 0.000559: 1.0244x slower Not significant Stddev: 0.00012 -> 0.00010: 1.1415x smaller (N = 500) Running 'query_values_list' benchmark ... Min: 0.000082 -> 0.000085: 1.0385x slower Avg: 0.000089 -> 0.000093: 1.0418x slower Significant (t=-4.441191) Stddev: 0.00001 -> 0.00002: 1.5940x larger (N = 500) Running 'url_resolve_flat_i18n_off' benchmark ... Min: 0.054035 -> 0.054465: 1.0079x slower Avg: 0.062802 -> 0.058801: 1.0680x faster Significant (t=4.849003) Stddev: 0.01815 -> 0.00330: 5.4996x smaller (N = 500) Running 'qs_filter_chaining' benchmark ... Min: 0.000242 -> 0.000301: 1.2454x slower Avg: 0.000255 -> 0.000320: 1.2553x slower Significant (t=-19.514075) Stddev: 0.00004 -> 0.00006: 1.3907x larger (N = 500) Running 'template_render' benchmark ... Min: 0.000849 -> 0.000823: 1.0308x faster Avg: 0.000985 -> 0.000914: 1.0773x faster Significant (t=2.995514) Stddev: 0.00036 -> 0.00038: 1.0474x larger (N = 500) Running 'query_get' benchmark ... Min: 0.000283 -> 0.000272: 1.0390x faster Avg: 0.000325 -> 0.000304: 1.0704x faster Significant (t=10.235216) Stddev: 0.00004 -> 0.00003: 1.3055x smaller (N = 500) Running 'query_none' benchmark ... Min: 0.000069 -> 0.000093: 1.3482x slower Avg: 0.000081 -> 0.000103: 1.2714x slower Significant (t=-3.771605) Stddev: 0.00011 -> 0.00008: 1.3869x smaller (N = 500) Running 'query_complex_filter' benchmark ... Min: 0.000048 -> 0.000039: 1.2131x faster Avg: 0.000051 -> 0.000042: 1.2180x faster Significant (t=23.139363) Stddev: 0.00001 -> 0.00001: 1.1332x smaller (N = 500) Running 'query_filter' benchmark ... Min: 0.000143 -> 0.000195: 1.3597x slower Avg: 0.000162 -> 0.000218: 1.3425x slower Significant (t=-15.508875) Stddev: 0.00007 -> 0.00003: 2.6056x smaller (N = 500) Running 'template_render_simple' benchmark ... Min: 0.000042 -> 0.000029: 1.4210x faster Avg: 0.000052 -> 0.000036: 1.4621x faster Significant (t=2.949575) Stddev: 0.00010 -> 0.00007: 1.3581x smaller (N = 500) Running 'default_middleware' benchmark ... Min: -0.000154 -> -0.000074: 0.4827x slower Avg: 0.000002 -> 0.000002: 1.5375x slower Not significant Stddev: 0.00003 -> 0.00003: 1.0173x smaller (N = 500) Running 'query_annotate' benchmark ... Min: 0.000200 -> 0.000204: 1.0182x slower Avg: 0.000230 -> 0.000245: 1.0629x slower Significant (t=-7.240006) Stddev: 0.00003 -> 0.00003: 1.0010x larger (N = 500) Running 'raw_sql' benchmark ... Min: 0.000013 -> 0.000015: 1.1728x slower Avg: 0.000014 -> 0.000016: 1.1890x slower Significant (t=-9.630569) Stddev: 0.00000 -> 0.00000: 1.3213x larger (N = 500) Running 'url_resolve_flat' benchmark ... Min: 0.054495 -> 0.053987: 1.0094x faster Avg: 0.059588 -> 0.059220: 1.0062x faster Not significant Stddev: 0.00520 -> 0.00563: 1.0816x larger (N = 500) Running 'l10n_render' benchmark ... Min: 0.001263 -> 0.000914: 1.3821x faster Avg: 0.001386 -> 0.001024: 1.3533x faster Significant (t=29.074072) Stddev: 0.00020 -> 0.00020: 1.0040x smaller (N = 500) Running 'query_count' benchmark ... Min: 0.000178 -> 0.000186: 1.0407x slower Avg: 0.000196 -> 0.000203: 1.0335x slower Significant (t=-2.855455) Stddev: 0.00005 -> 0.00002: 1.9799x smaller (N = 500) Running 'model_delete' benchmark ... Min: 0.000124 -> 0.000109: 1.1351x faster Avg: 0.000144 -> 0.000125: 1.1548x faster Significant (t=15.819525) Stddev: 0.00002 -> 0.00002: 1.3262x smaller (N = 500) Running 'query_iterator' benchmark ... Min: 0.000099 -> 0.000117: 1.1885x slower Avg: 0.000104 -> 0.000126: 1.2099x slower Significant (t=-28.698598) Stddev: 0.00001 -> 0.00001: 1.3498x larger (N = 500) Running 'template_compilation' benchmark ... Min: 0.000150 -> 0.000153: 1.0177x slower Avg: 0.000162 -> 0.000165: 1.0142x slower Not significant Stddev: 0.00009 -> 0.00008: 1.0964x smaller (N = 500) Running 'query_all_multifield' benchmark ... Min: 0.015027 -> 0.015956: 1.0618x slower Avg: 0.016603 -> 0.017869: 1.0763x slower Significant (t=-7.678978) Stddev: 0.00252 -> 0.00269: 1.0650x larger (N = 500) Running 'query_prefetch_related' benchmark ... Min: 0.014046 -> 0.013922: 1.0089x faster Avg: 0.015939 -> 0.016489: 1.0346x slower Significant (t=-3.883798) Stddev: 0.00227 -> 0.00221: 1.0253x smaller (N = 500) Running 'query_all_converters' benchmark ... Min: 0.000544 -> 0.000523: 1.0396x faster Avg: 0.000598 -> 0.000560: 1.0685x faster Significant (t=16.329893) Stddev: 0.00004 -> 0.00004: 1.0470x larger (N = 500) Running 'query_distinct' benchmark ... Min: 0.000103 -> 0.000109: 1.0592x slower Avg: 0.000112 -> 0.000116: 1.0375x slower Significant (t=-5.586589) Stddev: 0.00001 -> 0.00001: 1.0100x smaller (N = 500) Running 'query_dates' benchmark ... Min: 0.000356 -> 0.000405: 1.1369x slower Avg: 0.000403 -> 0.000460: 1.1406x slower Significant (t=-19.572384) Stddev: 0.00004 -> 0.00005: 1.1089x larger (N = 500) Running 'model_save_existing' benchmark ... Min: 0.003422 -> 0.003479: 1.0166x slower Avg: 0.003788 -> 0.003807: 1.0049x slower Not significant Stddev: 0.00021 -> 0.00017: 1.2258x smaller (N = 500) Running 'query_delete_related' benchmark ... Min: 0.000114 -> 0.000113: 1.0052x faster Avg: 0.000127 -> 0.000130: 1.0189x slower Not significant Stddev: 0.00005 -> 0.00005: 1.0220x smaller (N = 500) Running 'url_reverse' benchmark ... Min: 0.000048 -> 0.000050: 1.0329x slower Avg: 0.000055 -> 0.000063: 1.1449x slower Significant (t=-2.155616) Stddev: 0.00005 -> 0.00007: 1.3065x larger (N = 500) Running 'query_latest' benchmark ... Min: 0.000139 -> 0.000143: 1.0305x slower Avg: 0.000153 -> 0.000157: 1.0231x slower Significant (t=-2.436627) Stddev: 0.00002 -> 0.00002: 1.1560x larger (N = 500) Running 'form_create' benchmark ... Min: 0.000014 -> 0.000013: 1.0312x faster Avg: 0.000016 -> 0.000015: 1.0981x faster Not significant Stddev: 0.00002 -> 0.00002: 1.1374x larger (N = 500) Running 'query_update' benchmark ... Min: 0.000044 -> 0.000045: 1.0237x slower Avg: 0.000047 -> 0.000049: 1.0507x slower Significant (t=-5.285934) Stddev: 0.00001 -> 0.00001: 1.7229x larger (N = 500) Running 'query_in_bulk' benchmark ... Min: 0.000164 -> 0.000147: 1.1136x faster Avg: 0.000191 -> 0.000166: 1.1519x faster Significant (t=17.531877) Stddev: 0.00003 -> 0.00002: 1.4907x smaller (N = 500) Running 'url_resolve_nested' benchmark ... Min: 0.000047 -> 0.000039: 1.2059x faster Avg: 0.000066 -> 0.000053: 1.2379x faster Not significant Stddev: 0.00035 -> 0.00027: 1.3017x smaller (N = 500) Running 'model_creation' benchmark ... Min: 0.000071 -> 0.000075: 1.0607x slower Avg: 0.000080 -> 0.000085: 1.0648x slower Not significant Stddev: 0.00007 -> 0.00004: 1.6986x smaller (N = 500) Running 'query_order_by' benchmark ... Min: 0.000144 -> 0.000159: 1.1010x slower Avg: 0.000160 -> 0.000176: 1.1021x slower Significant (t=-8.959905) Stddev: 0.00003 -> 0.00003: 1.0795x larger (N = 500) Running 'startup' benchmark ... Skipped: Django 1.9 and later has changed app loading. This benchmark needs fixing anyway. Running 'form_clean' benchmark ... Min: 0.000004 -> 0.000004: 1.0084x slower Avg: 0.000004 -> 0.000004: 1.0378x faster Not significant Stddev: 0.00000 -> 0.00000: 1.6388x smaller (N = 500) Running 'locale_from_request' benchmark ... Min: 0.000112 -> 0.000107: 1.0460x faster Avg: 0.000119 -> 0.000115: 1.0323x faster Not significant Stddev: 0.00007 -> 0.00006: 1.0659x smaller (N = 500) Running 'query_exists' benchmark ... Min: 0.000281 -> 0.000273: 1.0274x faster Avg: 0.000327 -> 0.000304: 1.0761x faster Significant (t=8.912446) Stddev: 0.00005 -> 0.00003: 1.4371x smaller (N = 500) Running 'query_values_10000' benchmark ... Min: 0.005139 -> 0.005398: 1.0505x slower Avg: 0.005799 -> 0.005876: 1.0133x slower Not significant Stddev: 0.00117 -> 0.00113: 1.0364x smaller (N = 500) Running 'query_exclude' benchmark ... Min: 0.000161 -> 0.000160: 1.0074x faster Avg: 0.000177 -> 0.000174: 1.0209x faster Significant (t=3.498767) Stddev: 0.00002 -> 0.00002: 1.0594x smaller (N = 500) Running 'query_raw' benchmark ... Min: 0.005483 -> 0.005660: 1.0323x slower Avg: 0.006040 -> 0.006549: 1.0843x slower Significant (t=-6.551792) Stddev: 0.00110 -> 0.00134: 1.2183x larger (N = 500) Running 'url_resolve' benchmark ... Min: 0.004650 -> 0.004575: 1.0164x faster Avg: 0.005069 -> 0.004889: 1.0370x faster Significant (t=7.516165) Stddev: 0.00044 -> 0.00030: 1.4556x smaller (N = 500) Running 'model_save_new' benchmark ... Min: 0.003318 -> 0.003369: 1.0154x slower Avg: 0.003624 -> 0.003783: 1.0437x slower Significant (t=-9.047954) Stddev: 0.00026 -> 0.00029: 1.1087x larger (N = 500) Running 'query_all' benchmark ... Min: 0.007900 -> 0.008847: 1.1198x slower Avg: 0.008945 -> 0.010023: 1.1206x slower Significant (t=-7.386401) Stddev: 0.00224 -> 0.00237: 1.0590x larger (N = 500) ```