我需要生成介于0和指定间隔之间的正弦波数据(仅正值),并且对于正弦波的每个值,数据都会调用某些函数。
当前,我正在使用以下代码生成介于0和指定间隔之间的正弦波数据
np.sin(np.linspace(0,180, count)* np.pi / 180. )
它生成介于0到180之间的值。数组的大小等于count。
现在,我需要为生成的数组的每个值调用一些函数。每个值调用该函数的总时间应在某个预定义的时间间隔内完成。我尝试通过将预定义的时间间隔除以sleep
来使用count
函数。
我想知道是否还有其他方法可以实现上述功能,因为指令执行可能需要一些时间。
答案 0 :(得分:2)
假设您想每10秒运行一次函数foo()
,但是foo()
的实际运行时间未知。在不依靠硬实时编程的情况下,您能做的最好的事情就是获取在以下时间间隔的其余时间:分别在调用foo()
和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
的执行频率可能会比所需的时间少。
答案 1 :(得分:1)
只需在@DYZ的答案周围放一些Python,就可以使用装饰器或上下文管理器来“修补”目标函数,并花一些时间来完成。
在下面的代码中,您有一个包含五个元素的列表,并且想要打印每个元素,总时间为5s,因此打印每个元素应该花费1s。
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)