Skip to content

Instantly share code, notes, and snippets.

@andriykohut
Last active December 30, 2016 14:04
Show Gist options
  • Save andriykohut/d50ebc285a289d368398a6d1101989e1 to your computer and use it in GitHub Desktop.
Save andriykohut/d50ebc285a289d368398a6d1101989e1 to your computer and use it in GitHub Desktop.
Raw string rendering (pystache vs jinja)
import re
import string
import timeit
from pystache import render as pystache_render
from jinja2 import Environment, Template
TEXT = 'Hello {{ name }}!'
CONTEXT = {'name': 'Tod'}
N_RUNS = 10000
class LazyFormatter(string.Formatter):
def get_value(self, key, args, kwargs):
'''Overrides string.Formatter.get_value'''
if isinstance(key, int):
return args[key]
else:
return kwargs.get(key, '')
lazay_fmt = LazyFormatter()
def fake_template_render(text, context):
s = re.sub(r'{{\s*', r'{', text)
s = re.sub(r'\s*}}', r'}', s)
return lazay_fmt.format(s, **context)
def jinja_render(text, context):
return Environment().from_string(text).render(context)
def jinja_render_template(text, context):
return Template(text).render(context)
if __name__ == '__main__':
assert jinja_render(TEXT, CONTEXT) == jinja_render_template(TEXT, CONTEXT) == pystache_render(TEXT, CONTEXT) ==\
fake_template_render(TEXT, CONTEXT) == "Hello Tod!"
jinja_time = timeit.timeit(stmt="jinja_render(TEXT, CONTEXT)", globals=globals(), number=N_RUNS)
jinja_time_template = timeit.timeit(stmt="jinja_render_template(TEXT, CONTEXT)", globals=globals(), number=N_RUNS)
pystache_time = timeit.timeit(stmt="pystache_render(TEXT, CONTEXT)", globals=globals(), number=N_RUNS)
fake_render_time = timeit.timeit(stmt="fake_template_render(TEXT, CONTEXT)", globals=globals(), number=N_RUNS)
print("jinja time: {}".format(jinja_time))
print("jinja template time: {}".format(jinja_time_template))
print("pystache time: {}".format(pystache_time))
print("fake render time: {}".format(fake_render_time))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment