Nehmen wir an, wir haben eine besonders einfache Funktion wie
%Vor% Diese Funktion funktioniert offensichtlich für mehrere eingebaute Python-Datentypen von x
und y
wie string, list, int, float, array usw. Da wir uns besonders für Arrays interessieren, betrachten wir zwei Arrays:
Dies gibt
zurück %Vor%genau wie wir es erwarten würden.
Was nun, wenn man Arrays als Eingänge für die folgende Funktion einwerfen möchte?
%Vor% doing >>>func(xx, yy)
würde einen Fehler auslösen.
Die erste offensichtliche Methode, die man sich vorstellen kann, ist die Funktion sp.vectorize
in scipy / numpy. Diese Methode hat sich jedoch als nicht sehr effizient erwiesen. Kann jemand eine robustere Art denken, irgendeine Funktion im Allgemeinen auf numply Arrays zu übertragen?
Wenn Sie den Code in einer Array-freundlichen Weise neu schreiben, ist das die einzige Möglichkeit, es würde helfen, wenn Sie es auch hier erwähnen könnten.
np.vectorize
ist ein allgemeiner Weg, um Python-Funktionen, die auf Zahlen basieren, in numpige Funktionen zu konvertieren, die auf ndarrays funktionieren.
Wie Sie jedoch betonen, ist es nicht sehr schnell, da es eine Python-Schleife "unter der Haube" verwendet.
Um eine bessere Geschwindigkeit zu erreichen, müssen Sie eine Funktion in Handarbeit erstellen, die numpige Arrays als Eingabe erwartet und diesen Vorteil ausnutzt:
%Vor%Zur Leistung:
test.py :
%Vor%Läuft:
Mit N = 30:
%Vor%Mit N = 1000:
%Vor% Dies deutet darauf hin, dass func2a
etwas schneller ist als func2c
(und func2b
ist schrecklich langsam).
Für diesen speziellen Fall könnten Sie auch eine Funktion schreiben, die sowohl auf NumPy-Arrays als auch auf einfachen Python-Floats funktioniert:
%Vor% Diese Version ist auch mehr als vier mal so schnell wie unutbu's func2a()
(getestet mit N = 100
).
Nur um die Grundidee zu verstehen, können Sie Ihre Funktion ändern, zum Beispiel diese Art von Weg:
%Vor%Also sollte in Ihrem Fall etwas Ähnliches ein vernünftiger Ausgangspunkt sein:
%Vor%Obwohl diese Art der Verarbeitung Ressourcen zu verschwenden scheint, ist dies nicht unbedingt der Fall. Messen Sie immer die tatsächliche Leistung Ihrer Programme und nehmen Sie dann (nicht frühere) notwendige Änderungen vor.
IMHO für einen zusätzlichen Vorteil: Diese Art der "Vektorisierung" macht Ihren Code wirklich konsistent und lesbar.