My favorites | Sign in
Project Logo
                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
# -*- encoding: utf-8 -*-
# Template language benchmarks
#
# Objective: Generate a 1000x10 HTML table as fast as possible.
#
# Author: Jonas Borgström <jonas@edgewall.com>

import cgi
import sys
import timeit
import StringIO
import cStringIO
try:
import genshi
from genshi.builder import tag
from genshi.template import MarkupTemplate
from genshi.template import TextTemplate as NewTextTemplate
except ImportError:
MarkupTemplate = None
NewTextTemplate = None
genshi = None

try:
from elementtree import ElementTree as et
except ImportError:
et = None

try:
import cElementTree as cet
except ImportError:
cet = None

try:
import neo_cgi, neo_cs, neo_util
except ImportError:
neo_cgi = None

try:
import kid
except ImportError:
kid = None

try:
from django.conf import settings
settings.configure()
from django.template import Context as DjangoContext
from django.template import Template as DjangoTemplate
except ImportError:
DjangoContext = DjangoTemplate = None

try:
from mako.template import Template as MakoTemplate
except ImportError:
MakoTemplate = None

try:
import spitfire as SpitfireTemplate
except ImportError:
SpitfireTemplate = None

try:
from Cheetah import Template as CheetahTemplate
except ImportError:
CheetahTemplate = None

table = [dict(a=1,b=2,c=3,d=4,e=5,f=6,g=7,h=8,i=9,j=10)
for x in range(1000)]

if MarkupTemplate:
genshi_tmpl = MarkupTemplate("""
<table xmlns:py="http://genshi.edgewall.org/">
<tr py:for="row in table">
<td py:for="c in row.values()" py:content="c"/>
</tr>
</table>
""")

genshi_tmpl2 = MarkupTemplate("""
<table xmlns:py="http://genshi.edgewall.org/">$table</table>
""")

genshi_text_tmpl = NewTextTemplate("""
<table>
{% for row in table %}<tr>
{% for c in row.values() %}<td>{c}</td>{% end %}
</tr>{% end %}
</table>
""")

if DjangoTemplate:
django_tmpl = DjangoTemplate("""
<table>
{% for row in table %}
<tr>{% for col in row.values %}{{ col|escape }}{% endfor %}</tr>
{% endfor %}
</table>
""")

def test_django():
"""Djange template"""
context = DjangoContext({'table': table})
django_tmpl.render(context)

if MakoTemplate:
mako_tmpl = MakoTemplate("""
<table>
% for row in table:
<tr>
% for col in row.values():
<td>${ col | h }</td>
% endfor
</tr>
% endfor
</table>
""")
def test_mako():
"""Mako Template"""
data = mako_tmpl.render(table=table)
#print "mako", len(data)

if SpitfireTemplate:
import spitfire.compiler.analyzer
import spitfire.compiler.util
spitfire_src = """<table xmlns:py="http://spitfire/">
#for $row in $table
<tr>
#for $column in $row.values()
<td>$column</td>
#end for
</tr>
#end for
</table>
"""
enable_filters = False
spitfire_tmpl = spitfire.compiler.util.load_template(
spitfire_src, 'spitfire_tmpl')

spitfire_tmpl_o1 = spitfire.compiler.util.load_template(
spitfire_src, 'spitfire_tmpl_o1', spitfire.compiler.analyzer.o1_options,
{'enable_filters':enable_filters})

spitfire_tmpl_o2 = spitfire.compiler.util.load_template(
spitfire_src, 'spitfire_tmpl_o2', spitfire.compiler.analyzer.o2_options,
{'enable_filters':enable_filters})

spitfire_tmpl_o3 = spitfire.compiler.util.load_template(
spitfire_src, 'spitfire_tmpl_o3', spitfire.compiler.analyzer.o3_options,
{'enable_filters':enable_filters})

spitfire_tmpl_o4 = spitfire.compiler.util.load_template(
spitfire_src, 'spitfire_tmpl_o4', spitfire.compiler.analyzer.o4_options,
{'enable_filters':enable_filters})
# run once to get psyco warmed up
spitfire_tmpl_o4(search_list=[{'table':table}]).main()


def test_spitfire():
"""Spitfire template"""
data = spitfire_tmpl(search_list=[{'table':table}]).main()
#print "spitfire", len(data)

def test_spitfire_o1():
"""Spitfire template -O1"""
data = spitfire_tmpl_o1(search_list=[{'table':table}]).main()
#print "spitfire -O1", len(data)

def test_spitfire_o2():
"""Spitfire template -O2"""
data = spitfire_tmpl_o2(search_list=[{'table':table}]).main()
#print "spitfire -O2", len(data)

def test_spitfire_o3():
"""Spitfire template -O3"""
data = spitfire_tmpl_o3(search_list=[{'table':table}]).main()
#print "spitfire -O3", len(data)

def test_spitfire_o4():
"""Spitfire template -O4"""
data = spitfire_tmpl_o4(search_list=[{'table':table}]).main()
#print "spitfire -O4", len(data)

if CheetahTemplate:
cheetah_src = """<table>
#for $row in $table
<tr>
#for $column in $row.values()
<td>$column</td>
#end for
</tr>
#end for
</table>"""
pre = set([k for k, v in sys.modules.iteritems() if v])
cheetah_template = CheetahTemplate.Template(cheetah_src, searchList=[{'table':table}])
# force compile
post = set([k for k, v in sys.modules.iteritems() if v])
#print post - pre

#print type(cheetah_template)
cheetah_template.respond()
cheetah_template = type(cheetah_template)

def test_cheetah():
"""Cheetah template"""
data = cheetah_template(searchList=[{'table':table}]).respond()
#print "cheetah", len(data)

if genshi:
def test_genshi():
"""Genshi template"""
stream = genshi_tmpl.generate(table=table)
data = stream.render('html', strip_whitespace=False)
#print "genshi", len(data)

def disabled_test_genshi_text():
"""Genshi text template"""
stream = genshi_text_tmpl.generate(table=table)
print "test_genshi_text", stream
data = stream.render('text')
print "test_genshi_text", 'data', stream

def test_genshi_builder():
"""Genshi template + tag builder"""
stream = tag.TABLE([
tag.tr([tag.td(c) for c in row.values()])
for row in table
]).generate()
stream = genshi_tmpl2.generate(table=stream)
stream.render('html', strip_whitespace=False)

def test_builder():
"""Genshi tag builder"""
stream = tag.TABLE([
tag.tr([
tag.td(c) for c in row.values()
])
for row in table
]).generate()
stream.render('html', strip_whitespace=False)

if kid:
kid_tmpl = kid.Template("""
<table xmlns:py="http://purl.org/kid/ns#">
<tr py:for="row in table">
<td py:for="c in row.values()" py:content="c"/>
</tr>
</table>
""")

kid_tmpl2 = kid.Template("""
<html xmlns:py="http://purl.org/kid/ns#">$table</html>
""")

def test_kid():
"""Kid template"""
kid_tmpl.table = table
kid_tmpl.serialize(output='html')

if cet:
def test_kid_et():
"""Kid template + cElementTree"""
_table = cet.Element('table')
for row in table:
td = cet.SubElement(_table, 'tr')
for c in row.values():
cet.SubElement(td, 'td').text=str(c)
kid_tmpl2.table = _table
kid_tmpl2.serialize(output='html')

if et:
def test_et():
"""ElementTree"""
_table = et.Element('table')
for row in table:
tr = et.SubElement(_table, 'tr')
for c in row.values():
et.SubElement(tr, 'td').text=str(c)
et.tostring(_table)

if cet:
def test_cet():
"""cElementTree"""
_table = cet.Element('table')
for row in table:
tr = cet.SubElement(_table, 'tr')
for c in row.values():
cet.SubElement(tr, 'td').text=str(c)
cet.tostring(_table)

if neo_cgi:
def test_clearsilver():
"""ClearSilver"""
hdf = neo_util.HDF()
for i, row in enumerate(table):
for j, c in enumerate(row.values()):
hdf.setValue("rows.%d.cell.%d" % (i, j), cgi.escape(str(c)))

cs = neo_cs.CS(hdf)
cs.parseStr("""
<table><?cs
each:row=rows
?><tr><?cs each:c=row.cell
?><td><?cs var:c ?></td><?cs /each
?></tr><?cs /each?>
</table>""")
cs.render()

def test_python_cstringio():
"""cStringIO"""
buffer = cStringIO.StringIO()
write = buffer.write
write('<table>\n')
for row in table:
write('<tr>\n')
for col in row.itervalues():
write('<td>\n')
write('%s' % col)
write('\n</td>\n')
write('</tr>\n')
write('</table>')
return buffer.getvalue()

def test_python_stringio():
"""StringIO"""
buffer = StringIO.StringIO()
write = buffer.write

write('<table>\n')
for row in table:
write('<tr>\n')
for col in row.itervalues():
write('<td>\n')
write('%s' % col)
write('\n</td>\n')
write('</tr>\n')
write('</table>')
return buffer.getvalue()

def test_python_array():
"""list concat"""
buffer = []
write = buffer.append

write('<table>\n')
for row in table:
write('<tr>\n')
for col in row.itervalues():
write('<td>\n')
write('%s' % col)
write('\n</td>\n')
write('</tr>\n')
write('</table>')
return ''.join(buffer)


def run(which=None, number=10):
tests = ['test_builder', 'test_genshi',
'test_genshi_text',
'test_genshi_builder', 'test_mako', 'test_kid', 'test_kid_et',
'test_et', 'test_cet', 'test_clearsilver', 'test_django',
'test_cheetah',
'test_spitfire', 'test_spitfire_o1',
'test_spitfire_o2', 'test_spitfire_o3', 'test_spitfire_o4',
'test_python_stringio', 'test_python_cstringio', 'test_python_array'
]

if which:
tests = filter(lambda n: n[5:] in which, tests)

for test in [t for t in tests if hasattr(sys.modules[__name__], t)]:
t = timeit.Timer(setup='from __main__ import %s;' % test,
stmt='%s()' % test)
time = t.timeit(number=number) / number

if time < 0.00001:
result = ' (not installed?)'
else:
result = '%16.2f ms' % (1000 * time)
print '%-35s %s' % (getattr(sys.modules[__name__], test).__doc__, result)


if __name__ == '__main__':
which = [arg for arg in sys.argv[1:] if arg[0] != '-']

if '-p' in sys.argv:
import hotshot, hotshot.stats
prof = hotshot.Profile("template.prof")
benchtime = prof.runcall(run, which, number=1)
stats = hotshot.stats.load("template.prof")
stats.strip_dirs()
stats.sort_stats('time', 'calls')
stats.print_stats()
else:
run(which, 1)
Show details Hide details

Change log

r96 by hannosch on Aug 02, 2008   Diff
Disabled broken genshi text template
benchmark
Go to: 
Project members, sign in to write a code review

Older revisions

r68 by msolo on Jun 09, 2008   Diff
added an option to generate code that
is backward compatible with Cheetah.
fixed double analysis bug in template
node.
added deferred exceptions for
...
r26 by msolo on Jan 21, 2008   Diff
added BufferIO class and fixed up the
bigtable performance test.
r21 by msolo on Jan 20, 2008   Diff
performance tuning for resolve_udn.
added format_string arg for
placeholders.
All revisions of this file

File info

Size: 10847 bytes, 393 lines
Powered by Google Project Hosting