代码之家  ›  专栏  ›  技术社区  ›  Rudresha Parameshappa

在一个时间间隔内运行一些指令集

  •  0
  • Rudresha Parameshappa  · 技术社区  · 5 年前

    我需要生成介于0和指定间隔之间的正弦波数据(只有正值),对于正弦波的每个值,数据调用一些函数。

    目前,我正在使用下面的代码生成介于0和指定间隔之间的正弦波数据

    np.sin(np.linspace(0,180, count)* np.pi / 180. )
    

    它生成0到180之间的值。数组的大小等于Count。

    现在,我需要为生成的数组的每个值调用一些函数。为每个值调用函数的总时间应该在一些预定义的时间间隔内完成。我试着用 sleep 函数,将预定义的时间间隔除以 count .

    我想知道是否还有其他方法来实现上述功能,因为指令执行可能需要一些时间。

    2 回复  |  直到 5 年前
        1
  •  2
  •   DYZ    5 年前

    假设你想运行函数 foo() 每10秒,但实际运行时间为 英尺() 是未知的。你能做的最好的,而不是诉诸于困难的实时编程,是获得当前时间之前和之后的调用 英尺() 然后 sleep() 其余时间间隔:

    import time
    INTERVAL = 10 # seconds
    
    # Repeat this fragment as needed
    start = time.time() # in seconds
    foo()
    elapsed = time.time() - start
    remains = INTERVAL - elapsed
    time.sleep(remains)
    

    但是,请记住 sleep 睡觉 至少 有那么多时间。由于日程安排,它可能会睡得更长,在这种情况下,您的功能 foo 可能执行的频率低于需要的频率。

        2
  •  1
  •   Raydel Miranda    5 年前

    只需在@dyz的答案周围放置一些python,就可以使用修饰器或上下文管理器来“修补”目标函数,并使其花费您想要完成的时间。

    在下面的代码中,您有一个包含五个元素的列表,您希望打印每个元素,总时间是5秒,因此打印每个元素需要1秒。

    import time
    
    data = [1, 2, 3, 4, 5]
    
    # Decorator.
    def patch_execution_time(limit):
        def wrapper(func):
            def wrapped(*args, **kwargs):
                init = time.time()
                result = func(*args, **kwargs)
                end = time.time()
                elapsed = end - init
                if elapsed < limit:
                    time.sleep(limit - elapsed)
                return result
            return wrapped
        return wrapper
    
    # Context manager, more usefull if the total time interval
    # is dynamic.
    class patch_execution_time_cxt(object):
    
        def __init__(self, operation, time):
            self.operation = operation
            self.time = time
    
        def __enter__(self):
            return patch_execution_time(self.time)(self.operation)
    
        def __exit__(self, *args):
            pass
    
    
    # Two sample functions one decarated and the other for
    # ilustrating the use of the context manager.
    @patch_execution_time(1)
    def foo(item):
        print(item)
    
    def foo_1(item):
        print(item)
    
    print("Using decoreted ...")
    for item in data:
        foo(item)
    
    print("Using context manager ...")
    with patch_execution_time_cxt(foo_1, 1) as patched_foo:
        for item in data:
            patched_foo(item)