ProjectEulerはじめました

http://projecteuler.net/
頭の体操によさそう。とりあえず目指せレベル1*1


問題12:
「約数の個数が初めて500を超える三角数(Wikipedia.ja)を求めよ」

てきとーに。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import itertools
from datetime import datetime
start = datetime.now()

# 三角数ジェネレータ
def tri():
    sm = 0
    for n in itertools.count(1):
        sm += n
        yield sm

# 約数の個数を得る
def factors(n):
    return len([x for x in xrange(1, n+1) if n%x == 0])

for n in tri():
    if factors(n) > 500:
        print n
        break

end = datetime.now()
print end-start # 実行時間表示

あまりにも時間がかかるもんだから動かしたまま放置したところ、なんと解答に9時間18分かかってた(笑)
正解そのものは得られたものの、これではあんまりなので改良したい。

[追記]

def factors(n):
    def gen(n):
        sqrt_n = math.sqrt(n)
        for x in xrange(1, int(sqrt_n)+1):
            if n%x == 0:
                yield x
                if x**2 != n:
                    yield n/x

    return len(list(gen(n)))

とても速くなった(6秒台)

*1:25問以上達成