python - timeit 内的 Python 函数调用超时

标签 python python-2.7 timeout python-multithreading timeit

我有一个函数,我们称之为 my_function(*args, **kwargs) ,根据传递给它的参数,它需要 30 秒到很多小时(天)。我有一个不同参数的列表,我想知道给定参数这些函数将花费多长时间。

我对使用 timeit 还很陌生,但我已经学到了足够多的知识来完成这部分;然而,这对于我的目的来说并不是非常有效。任何一组需要超过 4 小时才能完成的争论都被认为是棘手的,尽管所有这些争论都能够在“有限”时间内解决。由于某些(可能是大多数)参数会导致运行时间长达 20 多个小时,因此我正在寻找一种在 4 小时后终止测试的方法,这样我就不必在弄清楚这一点后浪费时间这是很棘手的。

我看过Timeout on a Python function callStop 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/

相关文章:

python - python 中的鸡蛋和篮子游戏

python - PyCharm 可以列出项目中的所有 Python 错误吗?

python-2.7 - 如何刷新 PYQT4 中嵌入的 MatPlotlib?

http - golang 获取大量读取 tcp ip :port i/o timeout in ubuntu 14. 04 LTS

python - get_by_natural_key 和 natural_key 的区别

python - Apache Spark 读取 CSV 文件 - ClassNotFoundException

python - 在 2 个 python 列表的开头查找公共(public)元素的最快方法?

python - pygtk 从父节点按名称获取小部件

javascript - react 空闲定时器: Video Player Activity Detected as Idle

perl - Mojolicious session 过期与 default_expiration