Last active
December 30, 2016 14:04
-
-
Save andriykohut/d50ebc285a289d368398a6d1101989e1 to your computer and use it in GitHub Desktop.
Raw string rendering (pystache vs jinja)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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