2009-05-12 7 views
10

Czy istnieje sposób na zsumowanie listy numerów szybciej niż z pętlą for, być może w bibliotece Pythona? A może coś naprawdę tylko wielowątkowego/wektorowego może zrobić wydajnie?Szybszy sposób na zsumowanie listy liczb niż w przypadku pętli for?

Edycja: aby wyjaśnić, może to być lista dowolnych liczb, nieposortowanych, po prostu od użytkownika.

+1

Czy naprawdę znaczy „szybciej”, czy też oznaczać „pythonic”? Czy podsumowuje listę liczb naprawdę wąskie gardło w twoim kodzie, które wymaga optymalizacji? –

Odpowiedz

32

Możesz użyć sum(), aby podsumować wartości tablicy.

a = [1,9,12] 
print sum(a) 
2

Jeśli każdy termin na liście po prostu zwiększa się o 1, lub jeśli można znaleźć wzór w serii, można znaleźć formułę zsumowanie warunki n. Na przykład, suma serii {1,2,3, ..., n} = n (n + 1)/2

Czytaj więcej here

1

dobrze, ja nie wiem, czy to jest szybszy, ale możesz wypróbować trochę rachunku różniczkowego, aby uczynić go jedną operacją. (N * (N + 1))/2 daje sumę każdej liczby od 1 do N, i istnieją inne formuły do ​​rozwiązywania bardziej złożonych sum.

0

Aby uzyskać ogólną listę, musisz co najmniej raz przekroczyć każdego członka, aby uzyskać sumę, która jest dokładnie tym, co robi pętla for. Używanie bibliotek API (takich jak suma) jest wygodniejsze, ale wątpię, by był on rzeczywiście szybszy.

+0

Suma() będzie szybsza niż pętla for, ponieważ jest napisana w C. –

+0

@musicfreak: niezupełnie, będzie szybsza, ponieważ pozwala uniknąć narzutu pętli for (przypisania zmiennych i wywołania metod) – Algorias

+0

To dlatego, że jest napisane w C ... Tak czy inaczej jest szybciej. –

5

Jeszcze innym sposobem, aby podsumować listę z czasem pętli:

s = reduce(lambda x, y: x + y, l) 
+9

Należy użyć operatora.add zamiast lambda. Podsumowując pierwsze 100000 numerów to 34ms z lambda, ale tylko 19 ms z operatorem.add. (Suma jest lepsza niż obie po 15 ms). – Kiv

Powiązane problemy