有没有办法在必要时通过时间填充来执行具有一致执行时间的 python 脚本?
Is there a way to execute a python script with consistent execution time by time padding if necessary?
我知道任何 python 程序的执行时间应取决于 OS 并且不能由用户控制。但我想要的是程序在执行时间低于必要时间时进入睡眠状态。
假设我有一个 python 程序,最后有一个打印语句。
def foo():
...
...
return(ans)
print(foo())
我使用 timeit 评估了 foo 的执行时间范围。让它从 0.8 秒到 5.5 秒。为了安全起见,我选择整个脚本的执行时间为10秒。
如果 foo 的执行在 0.8 秒内完成,我希望程序在打印语句之前添加 9.2 秒的延迟。同样,如果执行在 5.5 秒内完成,则延迟 4.5 秒。
您可以通过两次调用 time.time()
来测量 foo()
的执行时间。然后,您可以使用 foo()
:
的计算执行时间来计算停止程序执行的时间量
import time
def foo():
...
start_time = time.time()
foo()
end_time = time.time()
if end_time - start_time < 10:
time.sleep(10 - (end_time - start_time))
请注意,我们使用 time.sleep()
而不是 while
循环来反复检查是否已经过足够的时间,因为 busy waiting wastes resources.
您基本上只需要休眠一段时间,即最长时间和实际执行时间之间的差值。你也可以做一个通用的装饰器。
class padtime:
def __init__(self, maxtime):
self.maxtime = float(maxtime)
def __call__(self, f):
def _f(*args, **kwargs):
start = time.time()
ret = f(*args, **kwargs)
end = time.time()
delay = self.maxtime - (end - start)
if delay > 0.0:
time.sleep(delay)
return ret
return _f
@padtime(9.5)
def foo():
...
return("Answer")
可以应用于任何函数。
我知道任何 python 程序的执行时间应取决于 OS 并且不能由用户控制。但我想要的是程序在执行时间低于必要时间时进入睡眠状态。
假设我有一个 python 程序,最后有一个打印语句。
def foo():
...
...
return(ans)
print(foo())
我使用 timeit 评估了 foo 的执行时间范围。让它从 0.8 秒到 5.5 秒。为了安全起见,我选择整个脚本的执行时间为10秒。
如果 foo 的执行在 0.8 秒内完成,我希望程序在打印语句之前添加 9.2 秒的延迟。同样,如果执行在 5.5 秒内完成,则延迟 4.5 秒。
您可以通过两次调用 time.time()
来测量 foo()
的执行时间。然后,您可以使用 foo()
:
import time
def foo():
...
start_time = time.time()
foo()
end_time = time.time()
if end_time - start_time < 10:
time.sleep(10 - (end_time - start_time))
请注意,我们使用 time.sleep()
而不是 while
循环来反复检查是否已经过足够的时间,因为 busy waiting wastes resources.
您基本上只需要休眠一段时间,即最长时间和实际执行时间之间的差值。你也可以做一个通用的装饰器。
class padtime:
def __init__(self, maxtime):
self.maxtime = float(maxtime)
def __call__(self, f):
def _f(*args, **kwargs):
start = time.time()
ret = f(*args, **kwargs)
end = time.time()
delay = self.maxtime - (end - start)
if delay > 0.0:
time.sleep(delay)
return ret
return _f
@padtime(9.5)
def foo():
...
return("Answer")
可以应用于任何函数。