2009-05-12 12 views
10

Gibt es eine Möglichkeit, eine Liste von Zahlen schneller als mit einer for-Schleife zusammenzufassen, vielleicht in der Python-Bibliothek? Oder ist das wirklich etwas, was nur Multithreading/Vektorverarbeitung effizient machen kann?Schneller Weg, um eine Liste von Zahlen als mit einer for-Schleife zu summieren?

Edit: Nur um zu klären, könnte es eine Liste von unsortierten Zahlen sein, nur Eingabe vom Benutzer.

+1

Meinen Sie wirklich „schneller“, oder meinst du mit „Pythonic“? Ist das Addieren einer Zahlenliste wirklich der Engpass in Ihrem Code, der optimiert werden muss? –

Antwort

32

Sie können sum() verwenden, um die Werte eines Arrays zu summieren.

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

Wenn jeder Begriff in der Liste erhöht einfach um 1, oder wenn Sie ein Muster in der Serie finden Sie eine Formel zum Summieren n Begriffe finden konnten. Zum Beispiel ist die Summe der Reihe {1,2,3, ..., n} = n (n + 1)/2

Lesen Sie mehr here

1

Nun, ich weiß nicht, ob es ist schneller, aber Sie könnten ein wenig Kalkül versuchen, um es zu einer Operation zu machen. (N * (N + 1))/2 gibt Ihnen die Summe jeder Zahl von 1 bis N, und es gibt andere Formeln, um komplexere Summen zu lösen.

0

Für eine allgemeine Liste müssen Sie mindestens jedes Mitglied mindestens einmal durchlaufen, um die Summe zu erhalten, was genau das ist, was eine for-Schleife tut. Die Verwendung von Bibliotheks-APIs (wie der Summe) ist bequemer, aber ich bezweifle, dass es tatsächlich schneller wäre.

+0

sum() wird schneller sein als eine for-Schleife, weil es in C geschrieben ist. –

+0

@musicfreak: nicht genau, es wird schneller sein, weil es den Overhead einer for-Schleife vermeidet (Variablenzuweisungen und Methodenaufrufe) – Algorias

+0

Was ist, weil es ist geschrieben in C ... So oder so ist es schneller. –

5

Noch eine andere Möglichkeit, eine Liste mit der Schleifenzeit zusammenzufassen:

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

Sie sollten operator.add anstelle von Lambda verwenden. Die Summe der ersten 100000 Zahlen beträgt 34ms mit dem Lambda, aber nur 19ms mit operator.add. (Summe ist besser als beide bei 15ms). – Kiv

Verwandte Themen