n00m: > This worked out in 5.28s > Imo it's not that *much* slower > (of course, Psyco can't help here)
There's no need of a chain here, so you can rewrite this: import itertools def subs(s): return len(set(itertools.chain( s[i:j] for i in xrange(len(s)) for j in xrange(i, len(s)+1)))) - 1 as: def subs(s): return len(set(s[i:j] for i in xrange(len(s)) for j in xrange(i, len(s)+1))) - 1 Psyco helps a little (about 10% on my PC) if you use it like this: from time import time import psyco; psyco.full() def main(): t = time() fin = open("input.txt") fout = open("output.txt", "w") fin.next() for line in fin: r = set() s = line.rstrip() len_s = len(s) for i in xrange(len_s): for j in xrange(i, len_s + 1): r.add(s[i : j]) print >> fout, len(r) - 1 fout.close() print time() - t main() Bye, bearophile -- http://mail.python.org/mailman/listinfo/python-list