Объединение функций перед вызовом - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь решить следующую проблему в python: у меня есть класс (назовем его Container), который содержит экземпляры другого класса (скажем, Worker).У экземпляров Worker есть метод (find_value), который оценивает довольно сложную математическую формулу, которая немного отличается для каждого экземпляра, поскольку зависит от их атрибутов.Класс Container затем содержит метод, который суммирует все вклады из его экземпляров Worker.На данный момент я реализовал это по существу как цикл for, повторяющийся во всех экземплярах и вызывающий функцию find_value для каждого.Может быть, это легче понять с помощью небольшого кода:

class Container:
    def __init__(self):
        # Each worker will have different values for its attributes
        self.workers = self.create_workers()

    def find_total_value(self, x, y, z):
        return sum([w.find_value(x, y, z) for w in self.workers])


class Worker:
    def __init__(self):
    # Initialise attributes that affect result returned by self.find_value
    # will be different for each instance

    def find_value(self, x, y, z)
        value = # Some complicated mathematical formula based on numpy 
                # functions that uses the instance attributes
        return value

Теперь проблема заключается в следующем: я хочу использовать функцию find_total_value для численного моделирования (в основном решение дифференциально-зависимого уравнения, зависящего от времени, с помощьюсиппи рутины).Однако цикл for в этой функции сильно замедляет вычисления, как и следовало ожидать.Как только все мои работники созданы, их атрибуты больше не меняются во время симуляции.

Поэтому мой вопрос заключается в следующем: возможно ли каким-то образом сгенерировать функцию find_total_value как сумму других функций?заранее?Так что функция действует так, как если бы было задействовано только одно огромное математическое выражение (комбинация всех математических выражений find_value функций экземпляров Worker? Я не уверен, что здесь используется правильная терминология, поэтомуЯ с удовольствием отредактирую свой вопрос, если понадобятся дальнейшие разъяснения.

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