mam na myśli to pytanie, a zwłaszcza komentarze do pierwszej odpowiedzi od @David Robinson i @mgilson: Sum the second value of each tuple in a listDlaczego rozpakowywanie jest szybsze niż dostęp do indeksu?
Oryginalny pytanie było podsumować drugą wartość każdego tuble:
structure = [('a', 1), ('b', 3), ('c', 2)]
pierwsza odpowiedź:
sum(n for _, n in structure)
Druga odpowiedź:
sum(x[1] for x in structure)
Zgodnie z dyskusją, pierwsza odpowiedź jest o 50% szybsza.
Kiedy już zorientowałem się, co robi pierwsza odpowiedź (pochodząca z Perla, szukałem w Google dla specjalnych _ zmiennych w pythonie), zastanawiałem się, jak to się stało, że pojawia się jako zadanie czystego podzbioru (otrzymując tylko drugi element każdego z nich tuple vs. pobieranie i wiązanie zmiennych obu elementów) jest rzeczywiście wolniejsze? Czy jest to brakująca możliwość optymalizacji dostępu do indeksu w Pythonie? Czy brakuje mi czegoś, co wymaga drugiej odpowiedzi, która wymaga czasu?
Niemniej jednak, spodziewam się, że 'BINARY_SUBSCRIPT' będzie dość wydajną operacją (po wyszukiwaniu), podczas gdy' UNPACK_SEQUENCE' nie jest (O (1) vs. O (n), jak to było), a operacja indeksu dolnego wymaga o jeden operacja przechowywania. W rzeczywistości twoje formatowanie kodu jest mylące - obie operacje przyjmują taką samą liczbę kodów operacji i nie wyjaśniłeś właściwie, dlaczego rozpakowywanie jest szybsze niż indeksowanie: w szczególności, dlaczego rozpakowywanie nie wymaga również wyszukiwania metod za pomocą '' '' ' PyObject_GetItem'? –
@KonradRudolph: Rozszerzony. Co ciekawe, jeśli zastąpisz krotkę listą, tabele mogą zostać odwrócone. –