Przede wszystkim przepraszam za straszny tytuł, ale nie mogłem znaleźć lepszego opisu.

Opiszmy mój problem za pomocą przykładu:

Mam dwie klasy: pracę domową i student

class Homework:
    def __init__(self, name):
        self.name = name

    def execute(self):
        print(f"Hello. I'm the {self.name} homework and my execution is long and tedious")
        result = 0
        return result

class Student:
    def __init__(self, homework):
        self.homework = homework

    def do_homework(self):
        return self.homework.execute()

Każdy uczeń przypisuje lekcje z listy, gdzie liczba dostępnych prac domowych jest znacznie mniejsza niż liczba uczniów (coś w rodzaju 2 prac domowych dla 300 studentów).

math = Homework('math')
chemistry = Homework('chemistry')

all_students  = [Student(math) for _ in range(5)]
all_students += [Student(chemistry)   for _ in range(5)]

Chciałbym zadzwonić do metody do_homework dla każdego ucznia i zebrać wyjścia na liście.

output = [st.do_homework() for st in all_students]

To zadzwoni do metody execute ich przypisanej pracy domowej. Jednakże, ponieważ wykonanie pracy domowej jest długa i nudna, chciałbym wykonać metodę execute każdego typu zadania domowego all_students.

Jednym z trywialnych rozwiązań może mieć dict Homeworks i utworzyć z niego dict wyników. Wtedy każdy uczeń powinien wskazywać * nie do samego miejsca pracy domowej, ale raczej kluczem tej pracy domowej w dict {x4}} *.

Uważam, że ten drugi rozwiązanie nieco kruche z powodu pośredniego łącza między students i homework opiera się tylko na porównaniu dwóch kluczy.

Czy możliwe jest osiągnięcie tego samego wyniku, utrzymując odniesienie do Homework wewnątrz Student? Każdy inteligentny pomysł?

PS: Wystarczy podać kontekst do ciekawych wśród was, "uczniów" w moim kodzie są elementy strukturalne, z których każdy może być inny materiał ("praca domowa"). Podczas wykonywania ustawiłem temperaturę i chcę uruchomić metodę, której wyjście zależy tylko od materiału elementu. Dlatego wszystkie elementy tego samego materiału wytwarzają tę samą wartość. Jednak to obliczenie jest "długie" i powtarzające się tysiące czasu dla każdego elementu, jest strata czasu, ponieważ mam tylko garść materiałów. Stąd moje pytanie

4
Luca 20 kwiecień 2021, 17:43

1 odpowiedź

Najlepsza odpowiedź

Możesz użyć functools.lru_cache, aby zapamiętać wynik Więc wynik połączenia metody jest buforowany

import functools

class Homework:
    def __init__(self, name):
        self.name = name

    @functools.lru_cache(maxsize=None)
    def execute(self):
        print(f"Hello. I'm the {self.name} homework and my execution is long and tedious")
        result = 0
        return result

Teraz po wykonaniu reszty kodu jedynym wyjściem jest

Cześć. Jestem lekcją domową matematyczną, a moja egzekucja jest długa i żmudna
Cześć. Jestem lekcją domową chemii, a moja egzekucja jest długa i żmudna

Jak widać każdy Homework Wynika tylko wynik execute jednego czasu.

4
Cory Kramer 20 kwiecień 2021, 14:47