Word Square generation in Python
Am working on a few minor improvements, but I think the major saving to be had is in removing the line 

square2, isquare2 = square[:], isquare[:]


Instead, do

sofar = square[x], isquare[y]
for o in options[sofar]:
    square[x], isquare[y] = o
    for s in addone(square, isquare, position+1):
        yield s
square[x], isquare[y] = sofar