commit -- why not...

This commit is contained in:
Guido van Rossum 1995-04-10 11:40:26 +00:00
parent f4449def3b
commit 21bc15b73d
5 changed files with 238 additions and 0 deletions

60
Demo/comparisons/README Normal file
View File

@ -0,0 +1,60 @@
Subject: Re: What language would you use?
From: Tom Christiansen <tchrist@mox.perl.com>
Date: 6 Nov 1994 15:14:51 GMT
Newsgroups: comp.lang.python,comp.lang.tcl,comp.lang.scheme,comp.lang.misc,comp.lang.perl
Message-Id: <39irtb$3t4@csnews.cs.Colorado.EDU>
References: <39b7ha$j9v@zeno.nscf.org> <39hhjp$lgn@csnews.cs.Colorado.EDU> <39hvsu$dus@mathserv.mps.ohio-state.edu>
[...]
If you're really into benchmarks, I'd love it if someone were to code up
the following problems in tcl, python, and scheme (and whatever else you'd
like). Separate versions (one optimized for speed, one for beauty :-) are
ok. Post your code so we can time it on our own systems.
0) Factorial Test (numerics and function calls)
(we did this already)
1) Regular Expressions Test
Read a file of (extended per egrep) regular expressions (one per line),
and apply those to all files whose names are listed on the command line.
Basically, an 'egrep -f' simulator. Test it with 20 "vt100" patterns
against a five /etc/termcap files. Tests using more elaborate patters
would also be interesting. Your code should not break if given hundreds
of regular expressions or binary files to scan.
2) Sorting Test
Sort an input file that consists of lines like this
var1=23 other=14 ditto=23 fred=2
such that each output line is sorted WRT to the number. Order
of output lines does not change. Resolve collisions using the
variable name. e.g.
fred=2 other=14 ditto=23 var1=23
Lines may be up to several kilobytes in length and contain
zillions of variables.
3) System Test
Given a list of directories, report any bogus symbolic links contained
anywhere in those subtrees. A bogus symbolic link is one that cannot
be resolved because it points to a nonexistent or otherwise
unresolvable file. Do *not* use an external find executable.
Directories may be very very deep. Print a warning immediately if the
system you're running on doesn't support symbolic links.
I'll post perl solutions if people post the others.
--tom
--
Tom Christiansen Perl Consultant, Gamer, Hiker tchrist@mox.perl.com
"But Billy! A *small* allowance prepares you for a lifetime of small
salaries and for your Social Security payments." --Family Circus

4
Demo/comparisons/patterns Executable file
View File

@ -0,0 +1,4 @@
^def
^class
^import
^from

50
Demo/comparisons/regextest.py Executable file
View File

@ -0,0 +1,50 @@
#! /usr/local/bin/python
# 1) Regular Expressions Test
#
# Read a file of (extended per egrep) regular expressions (one per line),
# and apply those to all files whose names are listed on the command line.
# Basically, an 'egrep -f' simulator. Test it with 20 "vt100" patterns
# against a five /etc/termcap files. Tests using more elaborate patters
# would also be interesting. Your code should not break if given hundreds
# of regular expressions or binary files to scan.
# This implementation:
# - combines all patterns into a single one using ( ... | ... | ... )
# - reads patterns from stdin, scans files given as command line arguments
# - produces output in the format <file>:<lineno>:<line>
# - is only about 2.5 times as slow as egrep (though I couldn't run
# Tom's test -- this system, a vanilla SGI, only has /etc/terminfo)
import string
import sys
import regex
from regex_syntax import *
regex.set_syntax(RE_SYNTAX_EGREP)
def main():
pats = map(chomp, sys.stdin.readlines())
bigpat = '(' + string.joinfields(pats, '|') + ')'
prog = regex.compile(bigpat)
for file in sys.argv[1:]:
try:
fp = open(file, 'r')
except IOError, msg:
print "%s: %s" % (file, msg)
continue
lineno = 0
while 1:
line = fp.readline()
if not line:
break
lineno = lineno + 1
if prog.search(line) >= 0:
print "%s:%s:%s" % (file, lineno, line),
def chomp(s):
if s[-1:] == '\n': return s[:-1]
else: return s
main()

50
Demo/comparisons/sortingtest.py Executable file
View File

@ -0,0 +1,50 @@
#! /usr/local/bin/python
# 2) Sorting Test
#
# Sort an input file that consists of lines like this
#
# var1=23 other=14 ditto=23 fred=2
#
# such that each output line is sorted WRT to the number. Order
# of output lines does not change. Resolve collisions using the
# variable name. e.g.
#
# fred=2 other=14 ditto=23 var1=23
#
# Lines may be up to several kilobytes in length and contain
# zillions of variables.
# This implementation:
# - Reads stdin, writes stdout
# - Uses any amount of whitespace to separate fields
# - Allows signed numbers
# - Treats illegally formatted fields as field=0
# - Outputs the sorted fields with exactly one space between them
# - Handles blank input lines correctly
import regex
import string
import sys
def main():
prog = regex.compile('^\(.*\)=\([-+]?[0-9]+\)')
def makekey(item, prog=prog):
if prog.match(item) >= 0:
var, num = prog.group(1, 2)
return string.atoi(num), var
else:
# Bad input -- pretend it's a var with value 0
return 0, item
while 1:
line = sys.stdin.readline()
if not line:
break
items = string.split(line)
items = map(makekey, items)
items.sort()
for num, var in items:
print "%s=%s" % (var, num),
print
main()

74
Demo/comparisons/systemtest.py Executable file
View File

@ -0,0 +1,74 @@
#! /usr/local/bin/python
# 3) System Test
#
# Given a list of directories, report any bogus symbolic links contained
# anywhere in those subtrees. A bogus symbolic link is one that cannot
# be resolved because it points to a nonexistent or otherwise
# unresolvable file. Do *not* use an external find executable.
# Directories may be very very deep. Print a warning immediately if the
# system you're running on doesn't support symbolic links.
# This implementation:
# - takes one optional argument, using the current directory as default
# - uses chdir to increase performance
# - sorts the names per directory
# - prints output lines of the form "path1 -> path2" as it goes
# - prints error messages about directories it can't list or chdir into
import os
import sys
from stat import *
def main():
try:
# Note: can't test for presence of lstat -- it's always there
dummy = os.readlink
except AttributeError:
print "This system doesn't have symbolic links"
sys.exit(0)
if sys.argv[1:]:
prefix = sys.argv[1]
else:
prefix = ''
if prefix:
os.chdir(prefix)
if prefix[-1:] != '/': prefix = prefix + '/'
reportboguslinks(prefix)
else:
reportboguslinks('')
def reportboguslinks(prefix):
try:
names = os.listdir('.')
except os.error, msg:
print "%s%s: can't list: %s" % (prefix, '.', msg)
return
names.sort()
for name in names:
if name == os.curdir or name == os.pardir:
continue
try:
mode = os.lstat(name)[ST_MODE]
except os.error:
print "%s%s: can't stat: %s" % (prefix, name, msg)
continue
if S_ISLNK(mode):
try:
os.stat(name)
except os.error:
print "%s%s -> %s" % \
(prefix, name, os.readlink(name))
elif S_ISDIR(mode):
try:
os.chdir(name)
except os.error, msg:
print "%s%s: can't chdir: %s" % \
(prefix, name, msg)
continue
try:
reportboguslinks(prefix + name + '/')
finally:
os.chdir('..')
main()