本篇主要是对django, jinja, jinja2, mako和cheetah五大python模板引擎性能的评测。对于这几个引擎,分别测试它们渲染字符串,变量替换,以及循环处理的速度,所有结果输出均为unicode,变量替换均需html转义,所有模板中,只有django默认开启了html转义,其它模板需要显式地打开。所有测试均不计算模板加载、编译时间,只计算渲染时间,因为模板通常只会加载一次,却会渲染多次。下面是所有模板引擎分别运行每个测试用例10000次所花的时间:
str var for
jinja2: 0.138658046722 0.640381097794 0.969153165817
mako: 0.389529943466 1.019780159 1.04453492165
cheetah: 0.350683927536 1.73273897171 2.3115170002
jinja: 0.102370023727 1.48854589462 3.32249498367
django: 0.168296098709 3.63100194931 13.236135006
str列仅仅是渲染1000字节页面所需的时间,var列是替换20个变量(变量间还夹着一些字符串)所需的时间,for列是循环20次所需的时间,循环体是100字节串加上一个循环变量。我并没有将变量个数和循环次数选得特别大,主要是想尽量接近实际场景,我认为一个页面中包含20个变量和20个循环是比较典型的情况。
大致来看,jinja2最快,mako也很快,和jinja2不分上下,django最慢,变量替换和循环要比jinja2慢4~13倍。接着仔细分析一下,str列表明mako和cheetah渲染字符串的速度比较慢,可见mako和cheetah要多做一些初始化工作,但这个时间应当是固定的,jinja和django都很快。var列表明jinja2的变量替换速度最快,从数值上来看mako要比jinja2慢大约一倍,如果减去渲染常量串的时间,jinja2需要0.5秒(0.64-0.14),mako需要0.6秒(1.0-0.4),两者相差得并不多,而cheetah要比jinja2慢1~2倍,django更慢,要慢4~6倍。for列表明jinja2和mako渲染循环的速度不分上下,如果减去渲染常量串的时间,mako要比jinja2稍快,cheetah仍然要慢1倍,django慢得更多,10多倍。总的来说,jinja2和mako都相当快,通常情况下jinja2要稍快一些,django要比jinja2慢10倍左右。在Django项目中使用jinja2模板应当是最好选择,因为它和django内置模板语法最相近,性能又非常好。但在实际应用中,模板通常不会是瓶颈,将django模板换成jinja,模板渲染速度可以从1ms变成0.1ms,看起来提升很明显,但和数据库查询的速度比较起来,真的不算什么。今天看了一同事写的一个IP地址到城市的转换程序,要花20ms,于是发现换模板的意义真不大,但我仍然换了。
以下是测试代码:
import re, sys
from timeit import Timer
from django.conf import settings
settings.configure()
def render_django(tmpl_str, tmpl_ctx):
from django.template import Template, Context
tmpl = Template(tmpl_str)
return lambda: tmpl.render(Context(tmpl_ctx))
def render_jinja2(tmpl_str, tmpl_ctx):
from jinja2 import Environment
tmpl = Environment(autoescape=True).from_string(tmpl_str)
return lambda: tmpl.render(tmpl_ctx)
def render_jinja(tmpl_str, tmpl_ctx):
from jinja import Environment
tmpl = Environment(auto_escape=True).from_string(tmpl_str)
return lambda: tmpl.render(tmpl_ctx)
def render_mako(tmpl_str, tmpl_ctx):
from mako.template import Template
tmpl = Template(tmpl_str, default_filters=['h'])
return lambda: tmpl.render(**tmpl_ctx)
def render_cheetah(tmpl_str, tmpl_ctx):
from Cheetah.Template import Template
from Cheetah.Filters import WebSafe
tmpl = type(Template(tmpl_str))
return lambda: tmpl(searchList=[tmpl_ctx], filter=WebSafe).respond()
django_syntax = dict(var='{{ %s }}', for_start='{%% for %s in %s %%}', for_end='{%% endfor %%}')
jinja2_syntax = jinja_syntax = django_syntax
cheetah_syntax = dict(var='$%s', for_start='#for $%s in $%s', for_end='#end for')
mako_syntax = dict(var='${%s}', for_start='%% for %s in %s:', for_end='%% endfor')
str_tmpl = 'a' * 1000
var_tmpl = ''.join(['%s @var,var%s@ ' % ('a'*100, i) for i in range(10)])
for_tmpl = '''\
@for_start,item,item_list@
%s @var,item@
@for_end@
''' % ('a'*100)
syntax_list = [
('jinja2', jinja2_syntax, render_jinja2),
('mako', mako_syntax, render_mako),
('cheetah', cheetah_syntax, render_cheetah),
('jinja', jinja_syntax, render_jinja),
('django', django_syntax, render_django),
]
tmpl_list = [
('str', str_tmpl, {}),
('var', var_tmpl, dict([('var%s'%i, '<foobar%s>'%i) for i in range(10)])),
('for', for_tmpl, dict(item_list=range(20))),
]
RE_TMPL = re.compile('@([\w,]+)@')
def bench(count=10000):
for name, syntax, render in syntax_list:
emit('%10s: ' % name)
for tmpl_type, tmpl_str, tmpl_ctx in tmpl_list:
def _sub(m):
s = m.group(1).split(',')
return syntax[s[0]] % tuple(s[1:])
tmpl_str = RE_TMPL.sub(_sub, tmpl_str)
render_tmpl = render(tmpl_str, tmpl_ctx)
emit('%-15s ' % Timer(render_tmpl).timeit(count))
emit('\n')
def emit(s):
sys.stdout.write(s)
sys.stdout.flush()
bench()
分享到:
相关推荐
用于比较Python模板引擎性能的工具包。 安装 首先,安装 。 我建议 。 然后克隆此存储库,并使其成为工作目录。 pipx install nox git clone https://github.com/bowmanjd/python-template-benchmarking.git cd ...
第 22 章 利用 pypy 提高 python 脚本的执行速度及测试性能 第 23 章 python 实现 select 和 epoll 模型 socket 网络编程 第 24 章 对 Python-memcache 分布式散列和调用的实现 第 25 章 Parallel Python 实现...
毕业设计:python基于模板的药品名称识别系统(源码 + 数据库 + 说明文档) 第二章 可行性分析 7 1. 业务流程可行性分析 7 2. 经济可行性 8 3. 技术可行性 8 3.1安装 8 4. 运行可行性 9 第三章 需求分析 9 1. 识别...
Awesome Python环境管理开发包和依赖分发构建工具文件操作日期和时间文本处理自然语言处理文档配置命令行工具图像处理音频视频地理位置HTTP数据库数据库驱动ORMWeb框架CMSRESTful API身份认证模板引擎事件和任务队列...
3.2性能需求分析 6 3.3系统设计规则与运行环境 7 3.4系统流程分析 7 3.5系统非功能需求分析 7 4 系统设计 9 4.1软件功能模块设计 9 4.2登录注册模块 9 4.3数据库设计 11 5系统实现 16 5.1管理员功能模块 16 5.2教师...
django基于python的图书馆管理系统(源码 + 说明文档) 2 系统开发环境 4 2.1 PYTHON简介 4 2.2MyEclipse环境配置 4 2.3 B/S结构简介 4 2.4MySQL数据库 5 ...6.3 性能测试 30 6.4 测试结果分析 30
我陆续也接触了 Python 的不少模板引擎,感觉可以总结一下了。 一、首先按照我的熟悉程度列一下:pyTenjin:我在开发 Doodle 和 91 外教时使用。Tornado.template:我在开发知乎日报时使用。PyJade:我在开发知乎...
该系统不仅包含了完整的Python源码,还提供了训练集和测试集,方便学习者进行实践操作和性能验证。源码编写规范,注释详尽,有助于学习者快速理解并掌握系统的实现原理。训练集和测试集则包含了多样化的答题卡样本,...
毕业设计:python WEB 服务统一身份认证协议设计与实现(源码 + 数据库 + 说明文档) 第2章 系统分析 9 2.1可行性分析 9 2.1.1技术可行性 9 2.1.2操作可行性 9 2.1.3经济可行性 9 2.2设计的基本思想 9 2.3基础功能...
毕业设计:python文本相似度计算系统(源码 + 数据库 + 说明文档) 第二章 可行性分析 7 2.1 业务流程可行性分析 7 2.2 经济可行性 7 2.3 技术可行性 8 2.4 运行可行性 8 第三章 需求分析 8 3.1 文本相似度的应用 8 ...
3.2性能需求分析 10 第四章 系统设计 11 4.1 总体设计 11 4.2语料库标注内容设计 11 4.3数据库的设计 11 第五章 系统的实现 13 5.1系统首页 13 5.2文本列表界面 13 5.3文本分类模式的操作 14 5.4文本分类标注页面 14...
毕业论文 2 开发工具及相关技术 4 ...2.2 MySQL数据库技术 4 2.3VUE渐进式框架 5 3 需求分析 6 3.1 需求陈述 6 3.2 可行性分析 6 3.3需求研究方法 7 3.4系统流程设计 8 3.2.2 用户登录流程 8 ...6.4.3 性能测试 18
3.3性能需求 11 3.4系统架构 11 3.4.1 平台架构图 11 3.4.2 平台用例图 12 第4章 概要设计 14 4.1数据库的概念结构设计 14 第5章 系统的实现与应用 15 5.1平台开发环境介绍 15 5.2系统的实现 16 5.2.1用户注册界面...
Python项目之django宾馆管理系统(源码 + 说明文档) 2 系统开发环境 3 2.1 Django框架 3 2.2 Python简介 3 2.3 B/S架构 3 2.4 MySQL环境配置 3 3 系统分析 5 ...6.3 性能测试 25 6.4 测试结果分析 25
双目立体视觉是计算机视觉范畴的核心之一,它利用双目相机来获得目标物体的图像,经过物体图像处理之后得到目标物体所在场景环境的三...系统测试表明,所开发的原型演示系统从界面、功能与性能方面均达到了设计的要求。
基于Django框架的图书管理系统是一个能够实现图书的增删查改功能的Web应用程序。下面是一个Python基于Django框架的图书管理系统的简要概述...8. 优化和测试:对系统进行优化,确保系统的性能和安全性。同时进行系统测试
基于python实现数独游戏软件工程设计 介绍 基于Pyhton语言实现9 x 9的数独游戏。 并采用DLX双向十字链表算法进行求解。 软件架构 运行环境:python3 + Pycharm 安装教程 源码运行文件参考Sudoku_Game-python/源...
毕业设计:python反爬技术的设计(源码 + 数据库 + 说明文档) 第2章 相关理论及技术 3 2.1 My SQL 数据库 3 2.2 B/S结构 3 2.3 python 4 2.4爬虫技术 5 ...5.3系统性能测试 13 5.4系统测试结果分析 13