In [1]:
def gen_collatz(n):
    yield n
    while n > 1:
        if n % 2 == 0:
            n /= 2
        else:
            n = 3 * n + 1
        yield n

In [2]:
list(gen_collatz(13))


Out[2]:
[13, 40, 20, 10, 5, 16, 8, 4, 2, 1]

In [3]:
len(list(gen_collatz(13)))


Out[3]:
10

In [4]:
def foo(n):
    max_chain_len = 0
    max_chain_n = 0
    for i in xrange(1, n):
        if len(list(gen_collatz(i))) > max_chain_len:
            max_chain_len = len(list(gen_collatz(i)))
            max_chain_n = i
    return max_chain_n, max_chain_len

In [5]:
%time print foo(1000000)[0]


837799
CPU times: user 55.21 s, sys: 0.01 s, total: 55.22 s
Wall time: 55.26 s