python/nondist/sandbox/parrotbench b4.py, NONE, 1.1 out4, NONE, 1.1 b.py, 1.1, 1.2 b0.py, 1.3, 1.4 out0, 1.2, 1.3

Update of /cvsroot/python/python/nondist/sandbox/parrotbench In directory sc8-pr-cvs1:/tmp/cvs-serv11112 Modified Files: b.py b0.py out0 Added Files: b4.py out4 Log Message: Another test, based on heapq.py. Fixed and updated b0.py and out0. --- NEW FILE: b4.py --- sample = ''' def heappush(heap, item): heap.append(item) _siftdown(heap, 0, len(heap)-1) def heappop(heap): lastelt = heap.pop() # raises appropriate IndexError if heap is empty if heap: returnitem = heap[0] heap[0] = lastelt _siftup(heap, 0) else: returnitem = lastelt return returnitem def heapreplace(heap, item): returnitem = heap[0] # raises appropriate IndexError if heap is empty heap[0] = item _siftup(heap, 0) return returnitem def heapify(x): n = len(x) for i in xrange(n//2 - 1, 0-1, 0-1): _siftup(x, i) def _siftdown(heap, startpos, pos): newitem = heap[pos] while pos > startpos: parentpos = (pos - 1) >> 1 parent = heap[parentpos] if parent <= newitem: break heap[pos] = parent pos = parentpos heap[pos] = newitem def _siftup(heap, pos): endpos = len(heap) startpos = pos newitem = heap[pos] # Bubble up the smaller child until hitting a leaf. childpos = 2*pos + 1 # leftmost child position while childpos < endpos: # Set childpos to index of smaller child. rightpos = childpos + 1 if rightpos < endpos: if heap[rightpos] <= heap[childpos]: childpos = rightpos # Move the smaller child up. heap[pos] = heap[childpos] pos = childpos childpos = 2*pos + 1 # The leaf at pos is empty now. Put newitem there, and bubble it up # to its final resting place (by sifting its parents down). heap[pos] = newitem _siftdown(heap, startpos, pos) ''' from b0 import Parser, Scanner, getcFromString, eval, instrumentTree, Node scanner = Scanner(getcFromString(sample).next).tokenize() parser = Parser(scanner) root = parser.parse() instrumentTree(Node) env = {} eval(root, env, env) heappush = env['heappush'] heappop = env['heappop'] # Simple sanity test heap = [] data = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0] for item in data: heappush(heap, item) sort = [] while heap: sort.append(heappop(heap)) print sort --- NEW FILE: out4 --- Define.eval({}, {}) Node.isgenerator() return False Node.isgenerator() return False return Define.eval({'heappush': <__main__.Function object at 0>}, {'heappush': <__main__.Function object at 0>}) Node.isgenerator() return False If.isgenerator() Node.isgenerator() return False Node.isgenerator() return False Node.isgenerator() return False Node.isgenerator() return False return False [...3670 lines suppressed...] return <built-in method pop of list object at 0> return 9 Name.assign(9, {'heappop': <__main__.Function object at 0>, '_siftup': <__main__.Function object at 0>, 'heapify': <__main__.Function object at 0>, 'heappush': <__main__.Function object at 0>, '_siftdown': <__main__.Function object at 0>, 'heapreplace': <__main__.Function object at 0>}, {'heap': []}) return return If.eval({'heappop': <__main__.Function object at 0>, '_siftup': <__main__.Function object at 0>, 'heapify': <__main__.Function object at 0>, 'heappush': <__main__.Function object at 0>, '_siftdown': <__main__.Function object at 0>, 'heapreplace': <__main__.Function object at 0>}, {'lastelt': 9, 'heap': []}) Name.eval({'heappop': <__main__.Function object at 0>, '_siftup': <__main__.Function object at 0>, 'heapify': <__main__.Function object at 0>, 'heappush': <__main__.Function object at 0>, '_siftdown': <__main__.Function object at 0>, 'heapreplace': <__main__.Function object at 0>}, {'lastelt': 9, 'heap': []}) return [] Assign.eval({'heappop': <__main__.Function object at 0>, '_siftup': <__main__.Function object at 0>, 'heapify': <__main__.Function object at 0>, 'heappush': <__main__.Function object at 0>, '_siftdown': <__main__.Function object at 0>, 'heapreplace': <__main__.Function object at 0>}, {'lastelt': 9, 'heap': []}) Name.eval({'heappop': <__main__.Function object at 0>, '_siftup': <__main__.Function object at 0>, 'heapify': <__main__.Function object at 0>, 'heappush': <__main__.Function object at 0>, '_siftdown': <__main__.Function object at 0>, 'heapreplace': <__main__.Function object at 0>}, {'lastelt': 9, 'heap': []}) return 9 Name.assign(9, {'heappop': <__main__.Function object at 0>, '_siftup': <__main__.Function object at 0>, 'heapify': <__main__.Function object at 0>, 'heappush': <__main__.Function object at 0>, '_siftdown': <__main__.Function object at 0>, 'heapreplace': <__main__.Function object at 0>}, {'lastelt': 9, 'heap': []}) return return return Return.eval({'heappop': <__main__.Function object at 0>, '_siftup': <__main__.Function object at 0>, 'heapify': <__main__.Function object at 0>, 'heappush': <__main__.Function object at 0>, '_siftdown': <__main__.Function object at 0>, 'heapreplace': <__main__.Function object at 0>}, {'lastelt': 9, 'returnitem': 9, 'heap': []}) Name.eval({'heappop': <__main__.Function object at 0>, '_siftup': <__main__.Function object at 0>, 'heapify': <__main__.Function object at 0>, 'heappush': <__main__.Function object at 0>, '_siftdown': <__main__.Function object at 0>, 'heapreplace': <__main__.Function object at 0>}, {'lastelt': 9, 'returnitem': 9, 'heap': []}) return 9 raise <__main__.DoReturn instance at 0> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] Index: b.py =================================================================== RCS file: /cvsroot/python/python/nondist/sandbox/parrotbench/b.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** b.py 31 Dec 2003 00:10:34 -0000 1.1 --- b.py 31 Dec 2003 01:33:07 -0000 1.2 *************** *** 3,4 **** --- 3,5 ---- import b2 import b3 + import b4 Index: b0.py =================================================================== RCS file: /cvsroot/python/python/nondist/sandbox/parrotbench/b0.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** b0.py 31 Dec 2003 00:10:34 -0000 1.3 --- b0.py 31 Dec 2003 01:33:07 -0000 1.4 *************** *** 1,7 **** def check(a, b): if not a == b: ! print (a, b) ! if __debug__: ! raise AssertionError("%r != %r" % (a, b)) def proto___new__(cls, name): --- 1,5 ---- def check(a, b): if not a == b: ! raise AssertionError("%.30r != %.30r" % (a, b)) def proto___new__(cls, name): *************** *** 185,197 **** ''' - s = Scanner(getcFromString(sample).next) - it = Clone(s.tokenize()) - it2 = Clone(it) - L = [] - for pair in it: - L.append(pair) - L2 = list(it2) - check(L, L2) - operators = { '<': 1, --- 183,186 ---- *************** *** 244,247 **** --- 233,239 ---- self.value = value + class DoBreak(Exception): + pass + def eval(body, globals, locals): for stmt in body: *************** *** 317,326 **** for value in self.seq.eval(globals, locals): self.var.assign(value, globals, locals) ! eval(self.body, globals, locals) def geneval(self, globals, locals): for value in self.seq.eval(globals, locals): self.var.assign(value, globals, locals) ! for v in geneval(self.body, globals, locals): ! yield v class While(Node): def __init__(self, test, body): --- 309,324 ---- for value in self.seq.eval(globals, locals): self.var.assign(value, globals, locals) ! try: ! eval(self.body, globals, locals) ! except DoBreak: ! break def geneval(self, globals, locals): for value in self.seq.eval(globals, locals): self.var.assign(value, globals, locals) ! try: ! for v in geneval(self.body, globals, locals): ! yield v ! except DoBreak: ! break class While(Node): def __init__(self, test, body): *************** *** 333,356 **** def eval(self, globals, locals): while self.test.eval(globals, locals): ! eval(self.body, globals, locals) def geneval(self, globals, locals): while self.test.eval(globals, locals): ! for value in geneval(self.body, globals, locals): ! yield value class If(Node): ! def __init__(self, test, body): self.test = test self.body = body def __repr__(self): return "%s(%r, ...)" % (self.__class__.__name__, self.test) def isgenerator(self): ! return isgenerator(self.body) def eval(self, globals, locals): if self.test.eval(globals, locals): eval(self.body, globals, locals) def geneval(self, globals, locals): if self.test.eval(globals, locals): for value in geneval(self.body, globals, locals): yield value class Return(Node): def __init__(self, expr=None): --- 331,367 ---- def eval(self, globals, locals): while self.test.eval(globals, locals): ! try: ! eval(self.body, globals, locals) ! except DoBreak: ! break def geneval(self, globals, locals): while self.test.eval(globals, locals): ! try: ! for value in geneval(self.body, globals, locals): ! yield value ! except DoBreak: ! break class If(Node): ! def __init__(self, test, body, elsebody=None): self.test = test self.body = body + self.elsebody = elsebody def __repr__(self): return "%s(%r, ...)" % (self.__class__.__name__, self.test) def isgenerator(self): ! return isgenerator(self.body) or (self.elsebody is not None and ! isgenerator(self.elsebody)) def eval(self, globals, locals): if self.test.eval(globals, locals): eval(self.body, globals, locals) + elif self.elsebody is not None: + eval(self.elsebody, globals, locals) def geneval(self, globals, locals): if self.test.eval(globals, locals): for value in geneval(self.body, globals, locals): yield value + elif self.elsebody is not None: + for value in geneval(self.elsebody, globals, locals): + yield value class Return(Node): def __init__(self, expr=None): *************** *** 377,380 **** --- 388,396 ---- value = self.expr.eval(globals, locals) yield value + class Break(Node): + def __repr__(self): + return "%s()" % (self.__class__.__name__,) + def eval(self, globals, locals): + raise DoBreak() class Print(Node): def __init__(self, exprs): *************** *** 438,441 **** --- 454,460 ---- v = self.expr.eval(globals, locals) return v[self.index.eval(globals, locals)] + def assign(self, value, globals, locals): + v = self.expr.eval(globals, locals) + v[self.index.eval(globals, locals)] = value class Call(Node): def __init__(self, expr, args): *************** *** 524,527 **** --- 543,547 ---- def nexttoken(self): self.token, self.value = rv = self.scanner.next() + ##print rv return rv def expect(self, token, value=None): *************** *** 540,544 **** def parse_stmt(self, keywords=('def', 'for', 'while', 'if', ! 'print', 'return', 'yield')): if self.value in keywords: return getattr(self, 'parse_' + self.value)() --- 560,564 ---- def parse_stmt(self, keywords=('def', 'for', 'while', 'if', ! 'print', 'return', 'yield', 'break')): if self.value in keywords: return getattr(self, 'parse_' + self.value)() *************** *** 554,558 **** while self.value == ',': self.nexttoken() ! arg.append(self.expect(NAME)) self.expect(OPERATOR, ')') self.expect(OPERATOR, ':') --- 574,578 ---- while self.value == ',': self.nexttoken() ! args.append(self.expect(NAME)) self.expect(OPERATOR, ')') self.expect(OPERATOR, ':') *************** *** 582,586 **** self.expect(NEWLINE) body = self.parse_body() ! return If(test, body) def parse_body(self): self.expect(INDENT) --- 602,613 ---- self.expect(NEWLINE) body = self.parse_body() ! if self.value != 'else': ! elsebody = None ! else: ! self.expect(NAME, 'else') ! self.expect(OPERATOR, ':') ! self.expect(NEWLINE) ! elsebody = self.parse_body() ! return If(test, body, elsebody) def parse_body(self): self.expect(INDENT) *************** *** 608,611 **** --- 635,642 ---- self.expect(NEWLINE) return Yield(e) + def parse_break(self): + self.expect(NAME, 'break') + self.expect(NEWLINE) + return Break() def parse_simple(self): e = self.parse_exprs() *************** *** 651,655 **** elif self.value == '(': self.nexttoken() ! args = self.parse_exprs() self.expect(OPERATOR, ')') t = Call(t, args) --- 682,691 ---- elif self.value == '(': self.nexttoken() ! if self.value == ')': ! args = [] ! else: ! args = self.parse_exprs() ! if isinstance(args, Exprs): ! args = args.exprs self.expect(OPERATOR, ')') t = Call(t, args) *************** *** 671,678 **** raise SyntaxError - scanner = Scanner(getcFromString(sample).next).tokenize() - parser = Parser(scanner) - root = parser.parse() - class List(list): __setitem__ = list.__setitem__ --- 707,710 ---- *************** *** 692,695 **** --- 724,728 ---- output = OutputFile() + def write(s): s = str(s).replace('<b0.', '<__main__.') *************** *** 710,717 **** print s, print >>output, s, def writeln(s=''): write(str(s) + '\n') ! indent = "" OutputFile.softspace = True def instrumentClass(cls): cname = cls.__name__ + '.' --- 743,768 ---- print s, print >>output, s, + def writeln(s=''): write(str(s) + '\n') ! ! def myhash(s, ord=ord): ! if not s: ! return 0 ! x = ord(s[0])<<7 ! for c in s: ! x = ((1000003*x) ^ ord(c)) & 0xffffffffL ! return x^len(s) ! ! def checkoutput(n=0): ! outputtext = output.getvalue() ! check(strhash(outputtext), n) ! ! strhash = myhash ! OutputFile.softspace = True + + indent = "" + def instrumentClass(cls): cname = cls.__name__ + '.' *************** *** 720,728 **** if hasattr(descr, '__get__'): setattr(cls, name, instrumentDescriptor(cname+name, descr)) def unInstrumentClass(cls): for name in cls.__dict__: ! descr = getattr(cls, name) if isinstance(descr, instrumentDescriptor): setattr(cls, name, descr.obj) class instrumentDescriptor(object): def __init__(self, name, obj): --- 771,781 ---- if hasattr(descr, '__get__'): setattr(cls, name, instrumentDescriptor(cname+name, descr)) + def unInstrumentClass(cls): for name in cls.__dict__: ! descr = cls.__dict__[name] if isinstance(descr, instrumentDescriptor): setattr(cls, name, descr.obj) + class instrumentDescriptor(object): def __init__(self, name, obj): *************** *** 734,737 **** --- 787,791 ---- return result return instrumentCall(self.name, result) + class instrumentCall(object): def __init__(self, name, obj): *************** *** 763,784 **** indent = oldindent scanner = Scanner(getcFromString(sample).next).tokenize() parser = Parser(scanner) - instrumentClass(Parser) root = parser.parse() ! def myhash(s, ord=ord): ! if not s: ! return 0 ! x = ord(s[0])<<7 ! for c in s: ! x = ((1000003*x) ^ ord(c)) & 0xffffffffL ! return x^len(s) ! ! def checkoutput(n=0): ! outputtext = output.getvalue() ! check(strhash(outputtext), n) ! ! strhash = myhash checkoutput(1365277872) --- 817,847 ---- indent = oldindent + def instrumentTree(base): + instrumentClass(base) + for cls in base.__subclasses__(): + instrumentTree(cls) + + def unInstrumentTree(base): + unInstrumentClass(base) + for cls in base.__subclasses__(): + unInstrumentTree(cls) + + s = Scanner(getcFromString(sample).next) + it = Clone(s.tokenize()) + it2 = Clone(it) + L = [] + for pair in it: + L.append(pair) + L2 = list(it2) + check(L, L2) + scanner = Scanner(getcFromString(sample).next).tokenize() parser = Parser(scanner) root = parser.parse() ! scanner = Scanner(getcFromString(sample).next).tokenize() ! parser = Parser(scanner) ! instrumentClass(Parser) ! root = parser.parse() checkoutput(1365277872) *************** *** 798,802 **** checkoutput(3960406533) - ##unInstrumentClass(Parser) it = Clone(getcFromString(unicode(sample, "utf8"))) it2 = Clone(it) --- 861,864 ---- *************** *** 813,825 **** checkoutput(3960406533) - def instrumentTree(base): - instrumentClass(base) - for cls in base.__subclasses__(): - instrumentTree(cls) - def unInstrumentTree(base): - unInstrumentClass(base) - for cls in base.__subclasses__(): - unInstrumentTree(cls) - instrumentTree(Node) scanner = Clone(Scanner(it2.next).tokenize()) --- 875,878 ---- *************** *** 827,837 **** parser = Parser(scanner) root = parser.parse() env = {} eval(root, env, env) g = env['pi']() for i in range(10): ! write(g.next()) ! writeln() ! out = output.getvalue() unInstrumentTree(Node) --- 880,892 ---- parser = Parser(scanner) root = parser.parse() + checkoutput(111416090) env = {} eval(root, env, env) g = env['pi']() + digits = [] for i in range(10): ! digits.append(g.next()) ! checkoutput(1793452098) ! print "".join(map(str, digits)) unInstrumentTree(Node) *************** *** 839,854 **** parser = Parser(scanner2) root = parser.parse() env = {} eval(root, env, env) g = env['pi']() for i in range(10): ! write(g.next()) ! writeln() out2 = output.getvalue() - check(out, out2) - check(strhash(out[:1000]), 773700721) - check(strhash(out[100000:101000]), 3131788725) - check(strhash(out[200000:201000]), 3508888315) - check(strhash(out[300000:301000]), 199799004) - check(strhash(out[400000:401000]), 84251599) - check(strhash(out[-1000:]), 620844360) --- 894,904 ---- parser = Parser(scanner2) root = parser.parse() + checkoutput(0) env = {} eval(root, env, env) g = env['pi']() + digits = [] for i in range(10): ! digits.append(g.next()) ! print "".join(map(str, digits)) out2 = output.getvalue() Index: out0 =================================================================== RCS file: /cvsroot/python/python/nondist/sandbox/parrotbench/out0,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** out0 30 Dec 2003 16:28:25 -0000 1.2 --- out0 31 Dec 2003 01:33:07 -0000 1.3 *************** *** 5895,12368 **** return "Number(u'0')" return "Return(Number(u'0'))" ! If.__init__(Binop(Name(u's'), u'==', String(u"''")), [Return(Number(u'0'))]) ! return ! If.__repr__() ! Binop.__repr__() ! Name.__repr__() ! return "Name(u's')" ! Literal.__repr__() ! return 'String(u"\'\'")' [...6577 lines suppressed...] return 5L ! 5 Node.geneval({u'strhash': <__main__.Function object at 0>, u'pi': <__main__.Generator object at 0>}, {u'a': 14007054816000L, u'q': 25, u'b': 2787459998400L, u'd': 5L, u'k': 13, u'a1': 455729992416000L, u'p': 144, u'b1': 84139894238400L, u'd1': 5L}) return <generator object at 0> Assign.eval({u'strhash': <__main__.Function object at 0>, u'pi': <__main__.Generator object at 0>}, {u'a': 14007054816000L, u'q': 25, u'b': 2787459998400L, u'd': 5L, u'k': 13, u'a1': 455729992416000L, u'p': 144, u'b1': 84139894238400L, u'd1': 5L}) --- 8871,8875 ---- Name.eval({u'strhash': <__main__.Function object at 0>, u'pi': <__main__.Generator object at 0>}, {u'a': 14007054816000L, u'q': 25, u'b': 2787459998400L, u'd': 5L, u'k': 13, u'a1': 455729992416000L, u'p': 144, u'b1': 84139894238400L, u'd1': 5L}) return 5L ! Node.geneval({u'strhash': <__main__.Function object at 0>, u'pi': <__main__.Generator object at 0>}, {u'a': 14007054816000L, u'q': 25, u'b': 2787459998400L, u'd': 5L, u'k': 13, u'a1': 455729992416000L, u'p': 144, u'b1': 84139894238400L, u'd1': 5L}) return <generator object at 0> Assign.eval({u'strhash': <__main__.Function object at 0>, u'pi': <__main__.Generator object at 0>}, {u'a': 14007054816000L, u'q': 25, u'b': 2787459998400L, u'd': 5L, u'k': 13, u'a1': 455729992416000L, u'p': 144, u'b1': 84139894238400L, u'd1': 5L}) *************** *** 15642,15644 **** Name.eval({u'strhash': <__main__.Function object at 0>, u'pi': <__main__.Generator object at 0>}, {u'a': 9576126383040000L, u'q': 29, u'b': 2742857884166400L, u'd': 3L, u'k': 15, u'a1': 346367486707200000L, u'p': 196, u'b1': 96034297911552000L, u'd1': 3L}) return 3L ! 3 --- 9173,9176 ---- Name.eval({u'strhash': <__main__.Function object at 0>, u'pi': <__main__.Generator object at 0>}, {u'a': 9576126383040000L, u'q': 29, u'b': 2742857884166400L, u'd': 3L, u'k': 15, u'a1': 346367486707200000L, u'p': 196, u'b1': 96034297911552000L, u'd1': 3L}) return 3L ! 3141592653 ! 3141592653
participants (1)
-
gvanrossumļ¼ users.sourceforge.net