#!/usr/bin/env python # -*- coding: utf-8 -*- # # see benchsimple.py # manually written python code (for Python3) # # probably nearly fastest possible... # Note: escape consumes about 1/3..1/2 of the time import time, sys from benchsimple import test_results, context_dict, N #---------------------- # evaluation cache={} def _eval(expr, a=None): if expr not in cache: cache[expr] = compile(expr,"","eval") return eval(cache[expr],{"__builtins__":None},nsDict) #---------------------- # different escapeing-routines (HTML, LATEX) = range(0, 2) #import cgi #import xml.sax.saxutils #from xml.sax.saxutils import escape,quoteattr def escape(s, format=HTML): # return cgi.escape(s, True) #is slower # return xml.sax.saxutils.escape(s) #s # return xml.sax.saxutils.escape(s,{'"':""","'":"&abc;"}) #s s = s.replace("&", "&") # must be done first! s = s.replace("<", "<") s = s.replace(">", ">") s = s.replace('"', """) s = s.replace("'", "'") return s #escape = escape_ #0.106..8, 0.0675..69, <>&"' #escape = cgi.escape #0.092..4, 0.061..2 <>& #escape = xml.sax.saxutils.escape #0.095..6, 0.063..67 <>& #cgi..., xml... are both slower if wrapped into escape-function myDict = context_dict.copy() #---------------------- # different handcoded versions result_header = ''' ''' def handcoded_eval_escape(nsDict): myDict.update(nsDict) l = [] write = l.append write(result_header) write(''' Benchsimple | ''') write(escape(_eval("title"))) write('''

Benchsimple | ''') write(escape(_eval("title"))) write('''

''' ) for i in enumerate(_eval("table")): nsDict["n"] =i[0] nsDict["row"]=i[1] write( ''' ''' ) for col in _eval("row"): nsDict["col"]=col if col == nsDict["highlight"]: write( ''' \n''' ) write( ''' \n''' ) write( '''
''' ) else: write( ''' ''' ) write( escape(str(_eval("col"))) ) write( '''
''' ) return "".join(l) def handcoded_eval_noescape(nsDict): myDict.update(nsDict) l = [] write = l.append write(result_header) write(''' Benchsimple | ''') write(_eval("title")) write('''

Benchsimple | ''') write(_eval("title")) write('''

''' ) for i in enumerate(_eval("table")): nsDict["n"] =i[0] nsDict["row"]=i[1] write( ''' ''' ) for col in _eval("row"): nsDict["col"]=col if col == nsDict["highlight"]: write( ''' \n''' ) write( ''' \n''' ) write( '''
''' ) else: write( ''' ''' ) write( str(_eval("col")) ) write( '''
''' ) return "".join(l) def handcoded_noeval_escape(nsDict): myDict.update(nsDict) l = [] write = l.append write(result_header) write(''' Benchsimple | ''') write(escape(nsDict["title"])) write('''

Benchsimple | ''') write(escape(nsDict["title"])) write('''

''' ) for i in enumerate(nsDict["table"]): nsDict["n"] =i[0] nsDict["row"]=i[1] write( ''' ''' ) for col in nsDict["row"]: nsDict["col"]=col if col == nsDict["highlight"]: write( ''' \n''' ) write( ''' \n''' ) write( '''
''' ) else: write( ''' ''' ) write( escape(str(nsDict["col"])) ) write( '''
''' ) return "".join(l) def handcoded_noeval_noescape(nsDict): myDict.update(nsDict) l = [] write = l.append write(result_header) write(''' Benchsimple | ''') write(nsDict["title"]) write('''

Benchsimple | ''') write(nsDict["title"]) write('''

''' ) for i in enumerate(nsDict["table"]): nsDict["n"] =i[0] nsDict["row"]=i[1] write( ''' ''' ) for col in nsDict["row"]: nsDict["col"]=col if col == nsDict["highlight"]: write( ''' \n''' ) write( ''' \n''' ) write( '''
''' ) else: write( ''' ''' ) write( str(nsDict["col"]) ) write( '''
''' ) return "".join(l) #----------------------------------------- # timer def timer(name="----", reset=False, overall=False, N=1, _=[]): """Simple timer: Print the time elapsed between its calls to stderr. :Example: >>> import sys;sys.stderr=sys.stdout # ignore this >>> timer() # init the timer >>> l=[i*2 for i in range(1,1000)] >>> timer("mytest") # doctest:+ELLIPSIS ### mytest ... s >>> timer() # doctest:+ELLIPSIS ### ---- ... s >>> time.sleep(1.01) >>> timer("sleep 1.01") # doctest:+ELLIPSIS ### sleep 1.01 ... s """ if _ == []: _.append(time.time()) _.append(_[0]) elif overall is True: print("### %-30s %8.6lf s" % (name,(time.time()-_[0])), file=sys.stderr) _[1] = time.time() else: print("### %-30s %8.6lf s" % (name,(time.time()-_[1])), file=sys.stderr) _[1] = time.time() if reset: _[0] = _[1] = time.time() #----------------------------------------- nsDict = context_dict print("-- for %s iterations --" % N) timer() for i in range(N): r1 = handcoded_eval_escape(nsDict) timer("handcoded, eval escape:", N) for i in range(N): r2 = handcoded_noeval_escape(nsDict) timer("handcoded, noeval escape:", N) for i in range(N): r3 = handcoded_eval_noescape(nsDict) timer("handcoded, eval noescape:", N) for i in range(N): r4 = handcoded_noeval_noescape(nsDict) timer("handcoded, noeval noescape:", N) print("handcoded, rk, 2013-04-01") test_results(r1, r2, r3, r4) print("Note: 2 are wrong because of 'noescape'") #-----------------------------------------