在运行python程序Euler#41时检查空闲状态

2024-09-28 05:15:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我想找到Spoiler alert Euler #41 problem的解决方案。我问的问题是它的子问题。我有解决问题的办法,但问题在于解决办法。这是我正在检查的实际情况:

large = 0
x = ''

for i in range(1,10):
x += '%d' %i
for perm in permutations(x):
    if(isPrime(int(perm))):
        large = perm

print large

这是排列功能:-你知道吗

def permutations(val):
    res = []
    if len(val) == 1:
        res = [val]
    else:
        for i, c in enumerate(val):
            for perm in permutations(val[:i]+val[i+1:]):
                res += [c+perm]

return res

上面的程序在1到987654321的排列中找到所有素数的排列。你知道吗

但问题是在大=7652413之后,没有进一步大的增长。程序在大约3秒钟内达到该值,但程序在大约4分钟内完成。所以我想知道有没有什么办法可以减少时间。你知道吗

这个问题也可以概括为一种方法,用来找出一个函数是否告诉你这个函数是否花费了太长的时间才得到想要的结果。你知道吗


Tags: 函数in程序forif时间resval
2条回答

只回答眼前的直接问题,就可以通过使用itertools.permutations显著加快代码的速度。你知道吗

但是,在数学上,你可以通过意识到你想要的素数最多有7位数来减少你的问题。如果它有8,那么1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 = 36,它可以被3整除,因此不能是素数。加9等于45,也可以被3整除。你知道吗

听起来你在寻找一种方法来应用超时作为一种启发,告诉你“可能完成了”,然后停止工作。你知道吗

最简单的方法是在开始时或每次递增large(取决于您认为相关的时间)时获取当前时间,然后每隔一段时间检查一次该时间,如果超过该时间则取消。你知道吗

如果在代码中手动“经常检查”是不合理的,那么可以使用后台线程来执行,但是让我们保持简单,因为这里似乎没有必要这样做。你知道吗

所以:

class Timeout(object):
    def __init__(self, timeout_seconds):
        self.timeout = datetime.timedelta(0, timeout_seconds)
        self.reset()
    def reset(self):
        self.start = datetime.datetime.now()
        self.stop = self.start + self.timeout
    def check(self):
        if datetime.datetime.now() > self.stop:
            raise Exception('Timeout!')

现在,你可以这样做:

t = Timeout(30)
for perm in permutations(x):
    if isPrime(int(perm)):
        large = perm
        t.reset()
    t.check()

如果您想使用自更新以来的循环数,而不是秒数,或者一些更奇特的启发式方法,那么就不再复杂了。你只需要描述启发式,然后把它翻译成代码。你知道吗

相关问题 更多 >

    热门问题