我有一个函数,我们称之为 my_function(*args, **kwargs)
,根据传递给它的参数,它需要 30 秒到很多小时(天)。我有一个不同参数的列表,我想知道给定参数这些函数将花费多长时间。
我对使用 timeit
还很陌生,但我已经学到了足够多的知识来完成这部分;然而,这对于我的目的来说并不是非常有效。任何一组需要超过 4 小时才能完成的争论都被认为是棘手的,尽管所有这些争论都能够在“有限”时间内解决。由于某些(可能是大多数)参数会导致运行时间长达 20 多个小时,因此我正在寻找一种在 4 小时后终止测试的方法,这样我就不必在弄清楚这一点后浪费时间这是很棘手的。
我看过Timeout on a Python function call和 Stop code after time period ,这可能是一个足够接近的问题,可以是重复的,但我在将这些答案与 timeit
整合时遇到了困难。这样,少于 4 小时的时间就会被记录下来,而长距离运行则会返回一些大于 4 小时的有效时间。
执行此操作的最佳方法是什么?
编辑:我遇到的问题之一是我看到的答案包含 func(*args,**kwargs)
而timeit
函数如下所示:
timeit.Timer('my_function(*args, **kwargs)', setup=setup).timeit(1)
我不知道如何处理这个表单。
编辑:我在下面使用线程提供的原始答案实际上并没有终止线程。通过使用以下函数运行它可以轻松地显示这一点。
def foo(x):
for i in xrange(1, x + 1):
sleep(1)
print i
return x
使用涉及 multiprocessing.Pool
的代码,实际上有一个 terminate()
,考虑到这一点。
最佳答案
基于 Timeout function using threading in python does not work 中找到的答案。如果您在 foo(x) 上尝试一下,它确实会停止计数,这与我之前的答案不同。
import multiprocessing as mp
import timeit
def timeout(func, args=(), kwargs=None, TIMEOUT=10, default=None, err=.05):
if hasattr(args, "__iter__") and not isinstance(args, basestring):
args = args
else:
args = [args]
kwargs = {} if kwargs is None else kwargs
pool = mp.Pool(processes = 1)
try:
result = pool.apply_async(func, args=args, kwds=kwargs)
val = result.get(timeout = TIMEOUT * (1 + err))
except mp.TimeoutError:
pool.terminate()
return default
else:
pool.close()
pool.join()
return val
def Timeit(command, setup=''):
return timeit.Timer(command, setup=setup).timeit(1)
def timeit_timeout(command, setup='', TIMEOUT=10, default=None, err=.05):
return timeout(Timeit, args=command, kwargs={'setup':setup},
TIMEOUT=TIMEOUT, default=default, err=err)
关于python - timeit 内的 Python 函数调用超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20360795/