4

Python プログラムでアルゴリズムを特定の秒数実行し、これまでの最良の結果を出力して終了するようにしたいと考えています。

そうするための最良の方法は何ですか?

私は次のことを試しましたが、うまくいきませんでした(プログラムは印刷後も実行され続けました):

def printBestResult(self):
    print(self.bestResult)
    sys.exit()

def findBestResult(self,time):
    self.t = threading.Timer(time, self.printBestResult)
    self.t.start() 

    while(1):
        # find best result
4

4 に答える 4

4

テストされていないコードですが、このようなものですか?

import time    
threshold = 60
start = time.time()

best_run = threshold
while time.time()-start < threshold:
   run_start = time.time()
   doSomething()
   run_time = time.time() - start
   if run_time < best_run:
       best_run = run_time
于 2012-07-09T21:20:11.193 に答える
2

Unix では、シグナルを使用できます。このコードは 1 秒後にタイムアウトし、その時間内に while ループを反復する回数をカウントします。

import signal
import sys

def handle_alarm(args):
    print args.best_val
    sys.exit()

class Foo(object):
    pass

self=Foo() #some mutable object to mess with in the loop
self.best_val=0
signal.signal(signal.SIGALRM,lambda *args: handle_alarm(self))

signal.alarm(1) #timeout after 1 second
while True:
    self.best_val+=1 # do something to mutate "self" here.

または、alarm_handler で簡単に例外を発生させ、それを while ループの外側でキャッチして、最良の結果を出力することができます。

于 2012-07-09T21:23:14.543 に答える
0

スレッドでこれを行いたい場合は、Event. Windowsでは機能しないことに注意してsignal.alarmください。その場合を除き、スレッド化が最善の策だと思います。

import threading
import time
import random

class StochasticSearch(object):
    def __init__(self):
        self.halt_event = threading.Event()

    def find_best_result(self, duration):
        halt_thread = threading.Timer(duration, self.halt_event.set)
        halt_thread.start()
        best_result = 0
        while not self.halt_event.is_set():
            result = self.search()
            best_result = result if result > best_result else best_result
            time.sleep(0.5)
        return best_result

    def search(self):
        val = random.randrange(0, 10000)
        print 'searching for something; found {}'.format(val)
        return val

print StochasticSearch().find_best_result(3)
于 2012-07-09T21:31:22.203 に答える
-1

終了条件が必要です。そうしないと、プログラムは永久に (またはメモリがなくなるまで) 実行されます。自分で追加してください。

于 2012-07-09T21:19:45.283 に答える