- Comprehensive benchmarks for various template include, extends and widget directives are here.
- bottle 0.12.8
- chameleon 2.22
- cheetah 2.4.4
- django 1.8
- jinja2 2.7.3
- mako 1.0.1
- durusworks qpy 1.2
- spitfire 0.7.15
- tenjin 1.1.1
- tornado 4.1
- web2py 2.0.9
- wheezy.template 0.1.159
virtualenv env env/bin/easy_install -O2 bottle chameleon cheetah django \ jinja2 mako tenjin webext tornado wheezy.html \ wheezy.templateDownload bigtable.py test:
wget https://bitbucket.org/akorn/wheezy.template/raw/tip/demos/bigtable/bigtable.pyAnd run it:
env/bin/python bigtable.pyRaw numbers (Intel Core 2 Duo @ 2.4 GHz x 2; OS X 10.10):
cpython 2.7.9 msec rps tcalls funcs bottle 94.06 10.63 163016 23 chameleon 70.96 14.09 161031 24 cheetah 179.02 5.59 225019 22 django 1135.57 0.88 1490076 65 jinja2 57.03 17.54 60018 26 list_append 11.70 85.44 63007 9 list_extend 10.36 96.49 23007 9 mako 45.16 22.14 93035 36 qpy_list_append 282.92 3.53 505023 14 spitfire 43.33 23.08 124016 23 tenjin 13.38 74.73 43010 13 tornado 80.96 12.35 233021 23 web2py 106.45 9.39 295015 20 wheezy_template 11.72 85.34 63009 11 pypy 2.5.1 msec rps tcalls funcs bottle 31.56 31.68 163020 25 chameleon 38.50 25.98 193036 25 cheetah 69.88 14.31 755039 33 django 79.72 12.54 1483081 65 jinja2 31.36 31.89 123018 27 list_append 20.17 49.57 103007 10 list_extend 25.21 39.67 63007 10 mako 22.02 45.42 153037 39 qpy_list_append not installed spitfire 65.87 15.18 123015 21 tenjin 252.41 3.96 13010 11 tornado 31.02 32.24 233021 23 web2py 30.16 33.15 295015 20 wheezy_template 20.62 48.50 103009 12 cpython 3.3.6 msec rps tcalls funcs bottle 62.30 16.05 133017 21 chameleon 87.64 11.41 182033 25 cheetah not installed django 1115.48 0.90 1440079 62 jinja2 65.61 15.24 60020 27 list_append 15.11 66.16 63008 10 list_extend 12.61 79.29 23008 10 mako 51.16 19.55 93036 37 qpy_list_append 257.25 3.89 495025 16 spitfire not installed tenjin 50.11 19.96 123012 16 tornado 183.37 5.45 353023 23 web2py not installed wheezy_template 14.03 71.28 63010 12 pypy3 2.4.0 msec rps tcalls funcs bottle 22.06 45.32 133021 23 chameleon 28.11 35.58 214038 26 cheetah not installed django 138.26 7.23 1463082 64 jinja2 78.77 12.70 123020 28 list_append 15.05 66.43 103008 11 list_extend 17.88 55.93 63008 11 mako 19.68 50.81 153038 40 qpy_list_append not installed spitfire not installed tenjin 21.44 46.64 123012 16 tornado 43.44 23.02 353025 25 web2py not installed wheezy_template 15.64 63.94 103010 13tcalls - a total number of calls, funcs - a number of unique functions used.
Looking for other benchmarks? Take a look at python web frameworks benchmarks for routing, url reverse and web frameworks.
Great.
ReplyDeleteHow about str() or html escape?
I had found that the bottle neck of template engine is in str() or html escape, not in list.append or ''.join().
(See http://www.slideshare.net/kwatch/how-to-create-a-highspeed-template-engine-in-python for details.)
If you have time, could you try webext?
http://www.kuwata-lab.com/tenjin/pytenjin-users-guide.html#tips-webext
Or enforce tenjin.Engine not to call str() function?
engine = tenjin.Engine(tostrfunc='')
# I'm the author of Tenjin and above presentation slide.
By the way, Jinja2, Mako, Tenjin, and wheezy.template have enough performance for web application. I believe that the performance bottle-neck of web application is not in them.
But... it is fun to pursue high performance of template engine!
Thank you for your comments. I have added webext optimization for tenjin. Please notice, there is huge performance degradation once I have webext installed for pypy (the benchmark for pypy does not have it installed).
DeleteNote, webext can not be installed into python3.3 virtual environment. Here are few errors:
Deletewebext.c:89:18: error: ‘PyString_Type’ undeclared (first use in this function)
webext.c:97:23: error: ‘PyInt_Type’ undeclared (first use in this function)
If you have a forum or blog, the number of comments/replies definitely load faster or slower with different template engines.
DeleteIt would be interesting to see Cheetah on this list: http://cheetahtemplate.org/
ReplyDeleteaccepted
DeleteThank you, superable
ReplyDeleteFor some reason when I run your bigtable.py benchmark to compare the lot against QPY (https://www.mems-exchange.org/software/), wheezy_template is performing roughly on par with list_append/list_extend. Any ideas why? This on a Linux Mint Debian Edition VM, Python 3.3.2.
ReplyDeleteQPY btw is turning in 60 rps vs 29 rps for list_*. I'll put examples up on my site shortly.
The wheezy.template translates markup to the code identical to list_append example.
DeleteThe difference in results is related to CPU switching for given process, thus you need stick it with one processor (use taskset) and make higher number of iterations (eliminate django first).
I've put up a post with some code samples and the results obtained for all the packages I'd installed in a Python 3.3.2 virtual instance:
ReplyDeletehttp://mikewatkins.ca/2013/06/12/python-fastest-template-engine/
QPY is fast but isn't a traditional HTML or text templating system as most know them these days. Thankfully when a different itch needs scratching there's a nice selection of web tools for Python developers that are "fast enough".
The top of the post has a reference to in-depth benchmarks for template engine directives like include, extends and widgets.
DeleteThe python unicode string concatenation via join is inefficient due to continuous buffer re-locations. While wheezy.template remains pure python implementation it rely on python core efficiency.
DeleteWhile evaluating impact of such improvement to real world application the result was so minimal that I decided to keep thing as is.
Good to know QPY went even further by utilizing C optimizations.
Another template system that'd be good to have up there is Spitfire.
ReplyDeletehttps://code.google.com/p/spitfire/
I have updated bigtable source code to include Spitfire.
DeleteIs wheezy.template compatible with Google App Engine?
ReplyDeleteI'd like to know this as well. Although since Google App Engine works with any WSGI compatible frameworks it should work.
DeleteHi, maybe i'll have more success here. I can't figure out how to use a variable as a key in whezzy:
ReplyDeletehttp://stackoverflow.com/questions/21760517/wheezy-template-dictionary-variable-lookup
@swi[str(i[1])]
Deletehi, can you take a look at new bottle template: simpletemplate
ReplyDeletejust added
DeleteDid you turn on Django template caching? Note that by default it is turned off whereas some of the other template systems it is turned on. See https://docs.djangoproject.com/en/1.7/topics/performance/#the-cached-template-loader
ReplyDeleteThe benchmark exclude template loading. It uses template directly, so it is instantiated once and render function is used. See here: https://bitbucket.org/akorn/wheezy.template/src/tip/demos/bigtable/bigtable.py#cl-268
DeleteWhat is new?
ReplyDelete