5

Mam funkcję w python2.7.12 który generuje listę z funkcji f (x) i ma maksymalną wartość takiego:przerwać listowych

max([f(x) for x in range(n)]) 

Teraz chcę przerwać generacji lista na wypadek, gdyby którykolwiek z jej elementów był większy od B, i zwróć ten element. Wynik byłby taki sam, jak robi:

v = -float("inf") 
for x in range(n): 
    v = max(v, f(x)) 
    if v > B: return v 
return v 

problemem jest dla pętli, jednocześnie generując mniej elementów, działa wolniej niż listy zrozumienia dla problemu Jestem obecnie pracuje. Czy istnieje sposób użycia funkcji sprawdzania list lub metody generatora simillar, ale czy jest to sprawdzanie przeciwko B i przerywanie mid-iteracji? Celem jest obliczenie TYLKO elementów NCESSARY, ale należy je uruchamiać szybciej niż pierwszy przykład (gdzie oblicza każdy element).

Edytuj: Próbowałem wielu wskazówek, które wymyśliliście i zdecydowaliście się na prostą implementację pętli while. Ostateczny kod skończyło się to w następujący sposób:

v = float("-inf") 
x = 0 
while x < n: 
    v = max(v, f(x)) 
    if v > B: return v 

To działa nieco szybciej niż pętli for, choć nie może być szybsze rozwiązanie (jeszcze nie raz wszystkich proponowanych rozwiązań, przepraszam) , ale lubię prostotę.

Dziękuję.

+0

Możesz dodać instrukcję if w zrozumieniu listy. – JackTheCrab

+0

@JackTheCrab, który wciąż je obliczałby –

+1

dlaczego nie tylko "while"? –

Odpowiedz

-2

Spróbuj tak:

>>> [x**2 for x in range(10)] 

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

[x**2 for x in range(10) if x < 7] 

[0, 1, 4, 9, 16, 25, 36]

EDYCJA: Zaznaczone przy pomocy [f (x) dla x w zakresie (10), jeśli f (x) < 7] - i wywołuje funkcję f (x) dwukrotnie, więc jest nawet wolniej

+0

Nadal oblicza pozostałe wartości i sprawdza względem wyrażenia. Podczas gdy wynik daje tę samą odpowiedź, czas obliczeń i co nie jest więcej niż powinien – MooingRawr

1

Więc tutaj jest generator, który generuje wartości z pierwszym argumentem dopóki wartość jest ponad jego drugi:

def generate_until_threshold(iterator, threshold): 
    for value in iterator: 
     yield value 
     if value > threshold: 
      return 

Wtedy to działa:

max(generate_until_threshold((f(x) for x in range(n)), B), -float('inf')) 

Ale to nie będzie działać tak szybko, jak listowego .

+0

dlaczego B? co jeśli wartość maksymalna wygenerowana przez 'f (x) dla x w zakresie (n)' jest mniejsza niż B? –

+0

Następnie instrukcja if jest zawsze fałszywa, i po prostu pętle nad całą rzeczą. – RemcoGerlich

+0

Domyślną wartością byłoby 'float ('- inf')'; ma zastosowanie tylko wtedy, gdy na wejściu nie ma wartości. –