Mercurial > cpython-lru_cache-weakref
view Tools/scripts/rgrep.py @ 45837:c5241069fffd legacy-trunk
Speed up test_dict by about 10x by only checking selected dict literal sizes,
instead of every integer from 0 to 400. Exhaustive testing wastes time without
providing enough more assurance that the code is correct.
| author | Jeffrey Yasskin <jyasskin@gmail.com> |
|---|---|
| date | Tue, 18 Mar 2008 05:12:41 +0000 |
| parents | 8a7a2f1f88f0 |
| children | 6b18a095c2e7 |
line wrap: on
line source
#! /usr/bin/env python """Reverse grep. Usage: rgrep [-i] pattern file """ import sys import re import getopt def main(): bufsize = 64*1024 reflags = 0 opts, args = getopt.getopt(sys.argv[1:], "i") for o, a in opts: if o == '-i': reflags = reflags | re.IGNORECASE if len(args) < 2: usage("not enough arguments") if len(args) > 2: usage("exactly one file argument required") pattern, filename = args try: prog = re.compile(pattern, reflags) except re.error, msg: usage("error in regular expression: %s" % str(msg)) try: f = open(filename) except IOError, msg: usage("can't open %s: %s" % (repr(filename), str(msg)), 1) f.seek(0, 2) pos = f.tell() leftover = None while pos > 0: size = min(pos, bufsize) pos = pos - size f.seek(pos) buffer = f.read(size) lines = buffer.split("\n") del buffer if leftover is None: if not lines[-1]: del lines[-1] else: lines[-1] = lines[-1] + leftover if pos > 0: leftover = lines[0] del lines[0] else: leftover = None lines.reverse() for line in lines: if prog.search(line): print line def usage(msg, code=2): sys.stdout = sys.stderr print msg print __doc__ sys.exit(code) if __name__ == '__main__': main()
