Geschwindigkeitstest - eine Liste summieren, selbstgeschrieben oder mit sum()

Hier teste ich kurz, wie lange ein selbstgeschriebenes Programm zum summieren einer Liste von Zahlen braucht und vergleiche sie mit der mitgelieferten Funktion sum().

Vorsicht: Die Daten hier sind von 2008. → Nachtrag 2016

Die Funktionen, die ich nutze sind:

def summieren(liste): 
	"""Summiere alle Zahlen der Liste manuell."""
	# erst brauchen wir einen Zähler, 
	# auf den wir alle Zahlen aufsummieren.
	gesamt = 0
	# Dann summieren wir 
	# alle Zahlen der Liste zu dem Zähler. 
	for x in liste: 
		# Das heißt, wir erhöhen ihn
		# für jede Zahl in der Liste um die Zahl. 
		gesamt += x
	# und geben ihn dann zurück. 
	return gesamt

und

def summieren(liste): 
	"""Summiere alle Zahlen der Liste mit sum()."""
	return sum(liste) 

Die benötigte Zeit teste ich, indem ich die Funtion in einem doctest jeweils 100001 mal ablaufen lasse und prüfe, wie lange python braucht, um das Skript zu auszuführen.

Die vollständigen Quelltexte habe ich an die Seite angehängt.

Die Aufrufe sind damit:
time python summieren_selbst.py # Selbstgeschriebener Code
time python summieren_sum.py # Eingebaute Funktion

Und ich erhalte die Ergebnisse:

$ time python summieren_selbst.py

real 0m7.536s
user 0m7.430s
sys 0m0.030s

$ time python summieren_sum.py

real 0m4.362s
user 0m4.260s
sys 0m0.070s

Damit braucht meine selbstgeschriebene Summierfunktion etwa 74% länger als die eingebaute.

Fazit: Ich konnte mir bestätigen, dass es besser ist, die eingebaute Funktion zu nutzen, statt sie selbst zu schreiben. Der eingebaute Code ist effizienter.

Nachtrag 2016: Wenn die Geschwindigkeit der Summe wirklich kritisch für dein Programm ist, dann lagere sie aus. In Fortran und C++ braucht ein Programm für die gleiche Aufgabe nur 10-20% der Laufzeit (Vorsicht: Zwischen diesem Text und dem Nachtrag lagen 8 Jahre Entwicklung. Der Python-Code braucht jetzt nur noch 0.2s, der angehängte Fortran-Code braucht 0.02s und der C++-code 0.07s. PyPy führt den neuen angehängten Python-code in 0.07s aus). Im angehängten C++-code habe ich statt 100000-mal über die gleiche Liste zu summieren über eine 100000-mal so lange Liste mit Zufallszahlen summiert, damit der Compiler nicht 99999 der Rechnungen als offensichtlich unnötig wegoptimiert ☺.

AnhangGröße
summieren_sum.py.txt476 Bytes
summieren_selbst.py.txt749 Bytes
summe.cpp_.txt767 Bytes
summe.f90__.txt221 Bytes
summen.py_.txt301 Bytes
summen.f90307 Bytes
Inhalt abgleichen
Willkommen im Weltenwald!
((λ()'Dr.ArneBab))



Beliebte Inhalte

sn.1w6.org news