richtigen Stil für element-Weise Operationen auf Listen ohne numpy (python)
Ich würde gerne operieren, die auf Listen-element element ohne Verwendung von numpy, zum Beispiel, ich möchte add([1,2,3], [2,3,4]) = [3,5,7]
und mult([1,1,1],[9,9,9]) = [9,9,9]
, aber ich bin mir nicht sicher, welchen Weg zu tun, wird es als 'richtige' Stil.
Den beiden Lösungen, die ich kam, waren
def add(list1,list2):
list3 = []
for x in xrange(0,len(list1)):
list3.append(list1[x]+list2[x])
return list3
def mult(list1, list2):
list3 = []
for x in xrange(0,len(list1)):
list3.append(list1[x]*list2[x])
return list3
def div(list1, list2):
list3 = []
for x in xrange(0,len(list1)):
list3.append(list1[x]/list2[x])
return list3
def sub(list1, list2):
list3 = []
for x in xrange(0,len(list1)):
list3.append(list1[x]-list2[x])
return list3
wo jeder Betreiber erhält eine separate Funktion
und
def add(a,b)
return a+b
def mult(a,b)
return a*b
def div(a,b)
return a/b
def sub(a,b)
return a-b
def elementwiseoperation(list1, list2, function):
list3 = []
for x in xrange(0,len(list1)):
list3.append(function(list1[x],list2[x]))
return list3
wo alle grundlegenden Funktionen definiert sind, und ich habe eine separate Funktion zu verwenden, Sie auf jedes element. Ich Magermilch durch die PEP8, aber nicht finden, alles direkt relevant. Welcher Weg ist besser?
- können Sie nicht verwenden
map
? stattelementwiseoperation
. Siehe: docs.python.org/2/library/functions.html#map - Verwandte : stackoverflow.com/questions/18713321/...
InformationsquelleAutor shimao | 2013-07-11
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den normalen Weg, dies zu tun wäre, um
map
oderitertools.imap
:Ideone: http://ideone.com/yRLHxW
map
ist ein c-implementierten version Ihreselementwiseoperation
, mit dem Vorteil, dass die standard-Namen, der Arbeit mit einem wiederholenden Art und wird schneller (auf einigen Versionen, siehe @nathan, die Antwort für einige Profilerstellung).Alternativ können Sie
partial
undmap
für eine erfreulich pointfree style:Ideone: http://ideone.com/BUhRCW
Sowieso, Sie haben die ersten Schritte in die funktionale Programmierung selbst. Ich schlage vor, Sie Lesen rund um das Thema.
Als eine Allgemeine Frage von Stil, Durchlaufen von index mit
range
wird im Allgemeinen als die falsche Sache, wenn Sie besuchen möchten jeden Artikel. Der übliche Weg dies zu tun ist einfach nur zum Durchlaufen der Struktur direkt. Verwendenzip
oderitertools.izip
Durchlaufen parallel:Und den gewohnten Weg zu Durchlaufen, um eine Liste zu erstellen ist nicht zu verwenden
append
, sondern eine Liste Verständnis:itertools
Funktion, die helfen könnte.Dies könnte getan werden, nur mit
map
undoperator
Modul:func
hier? Es ist buchstäblich nur ein alias fürmap
.func
weil nurmap
ist in Ordnungfunctools.partial
können diese in eine wiederverwendbare Funktion, die ohne Zwischenschaltung einerlamdba
.Können Sie zip:
Performance-Vergleich
@Marcin sagte, dass
map
"wäre sauberer und effizienter" als eine Liste Verständnis. Ich finde, dass die list-comprehension sieht besser aus, aber das ist Geschmackssache. Die Effizienz behaupten, ich fand auch überraschend, dass wir testen können.Hier ist ein Vergleich für unterschiedliche Liste-Größen, code zu generieren, der plot ist unten (beachten Sie, dass diese ausgeführt werden muss, in einem Jupyter notebook oder zumindest IPython. Auch, es dauert ein bisschen Zeit, um zu beenden).
numpy
ist nicht wirklich zu einem Vergleich, weil die OP benötigt, um die Arbeit mitlist
s, aber ich habe es da, wenn Sie interessiert sind, in der Leistung, es lohnt sich zu wissen, was die alternative wäre.Wie Sie sehen können, gibt es keinen Grund, die einen Ansatz bevorzugen, der andere stützt sich auf die Effizienz betrifft.
Wie etwa:
Nein, ist es nicht sinnvoll, das schreiben eigener Funktionen in diesem Fall.
Verwenden Sie einfach
map
undoperator
wie Sie nicht realisieren, was besser wäre.Jede Teigplatte auf
map
ist nur ein anderes Zeug zu legen auf Stapel.Keine eigene Implementierung langsamer ist, als die eingebaute Lösung.