Number of distinct substrings of a string [continuation]

Bearophile bearophileHUGS at lycos.com
Sun Nov 29 08:07:15 EST 2009


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



More information about the Python-list mailing list