Mantra is coming along nicely. Added type annotations, but am not doing anything with them yet. Without much optimization (and huge amounts of memory allocation), Mantra loop and list append are looking good:
a = [];
1..5000000:{int i | a += i;};
The equivalent python:
a = [];
for i in range(5000000):
a.append(i);
My unscientific wallclock measurements on my dual cpu mac (powerpc) with Java 1.5 shows Java doing about 3.0s vs 3.9s in python. I am using way more memory though I think.
When I make use of type info manually converting the += operator to a direct list.add operation rather than general message send, it goes much faster: 2.6s. I simply converted:
main_locals.a.invoke("+=",new mobject[]{closure1_args.i});
to
((mlist)main_locals.a).add(closure1_args.i);
On the other hand, python's highly optimized file I/O kicks Mantra's butt right now. Here is my word frequency code:
wfreq = map();
args:{ string filename |
f = File(filename);
f => words() => { string w |
c=wfreq[w];
if ( c is null ) wfreq[w]=mutint(1);
else c++;
};
};
pairs = wfreq.items(); pairs.sort({int x, int y | return x[1].compareTo(y[1]);});
pairs.backwards():{list p | print(p[1]); print(" "); println(p[0]);};
Processing a 5M file of text, takes about 3.6s in Mantra, but only 1.1s in Python. Here's the python code:
import sys
import string
freqtable = {}
def processfile(file, ftable):
infile = open(file, 'r')
for line in infile:
words = line.split()
for w in words:
try:
ftable[w] = ftable[w] + 1
except KeyError:
ftable[w] = 1
infile.close()
for f in sys.argv[1:]:
processfile(f, freqtable)
wordlist = freqtable.items()
wordlist.sort((lambda x, y : cmp(x[1], y[1])))
wordlist.reverse()
for p in wordlist:
print p[0], p[1]
AFAIK IO in Python is not particularily optimized - it's a rather thin wrapper around libc. I think perl does nasty hacks and can be even faster than C for IO intensive tasks.
Regarding the first example: does 1..5000000 create an actual list of 5m elements (like range(5000000) in Python) or is this a cheap interval object? You may try to use xrange().