This returns a uniformly distributed random sample of k items from a sequence of unknown length. The algorithm is called reservoir sampling.
def sample(seq, k):
seq = iter(seq)
result = [seq.next() for _ in xrange(k)]
for i, s in enumerate(seq):
r = random.randrange(i + k + 1)
if r < k: result[r] = s
return result