Выполнить некоторый набор инструкций в течение интервала времени - PullRequest
0 голосов
/ 09 января 2019

Мне нужно генерировать данные синусоидальной волны (только положительные значения) между 0 и заданным интервалом, и для каждого значения синусоидальной волны данные вызывают некоторую функцию.

В настоящее время я генерирую данные синусоидальной волны между 0 и указанным интервалом, используя код ниже

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

генерирует значения от 0 до 180. Размер массива равен count.

Теперь мне нужно вызвать некоторую функцию для каждого значения сгенерированного массива. Общее время вызова функции для каждого значения должно быть завершено в течение некоторого предварительно определенного интервала времени. Я попытался использовать функцию sleep, разделив заранее заданный интервал времени на count.

Мне интересно, есть ли какой-либо другой способ достижения вышеуказанной функциональности, потому что выполнение инструкции может занять некоторое время.

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Просто для того, чтобы немного подправить Python вокруг ответа @ DYZ, вы можете использовать декоратор или менеджер контекста, чтобы «исправить» вашу целевую функцию и заставить ее занять время, которое вы хотите завершить.

В следующем коде у вас есть список с пятью элементами, и вы хотите напечатать каждый из них, общее время составляет 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)
0 голосов
/ 09 января 2019

Допустим, вы хотите запускать функцию foo() каждые 10 секунд, но фактическое время выполнения 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 может выполняться реже, чем необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...