numpy ist praktisch für den Umgang mit Daten, aber Python hat eine langsame for-Schleife, sodass es keine Möglichkeit gibt, eine gute Differenzierung vorzunehmen. Wenn Sie mit f2py nur den Differentialteil in fortran schreiben, können Sie beschleunigen. Differenzierungsvorgänge sind vielen Analysen gemeinsam. Sobald Sie sie aufgeschrieben haben, können Sie sie verwenden.
Weitere Informationen finden Sie im offiziellen f2py-Handbuch unter hier.
Es scheint grundlegend zu sein, eine Funktion mit einer Unterroutine zu schreiben. Die Grundlagen sind wie folgt
intent (out)
verwaltetBeispielsweise kann eine "Funktion, die einem Array 1 hinzufügt und zurückgibt", wie folgt geschrieben werden. Der Dateiname sollte "f2py_test.f90" usw. sein.
subroutine add(qq,ix,qq_add)
implicit none
integer :: i
integer, intent(in) :: ix
real(8), dimension(ix), intent(in) :: qq
real(8), dimension(ix), intent(out) :: qq_add
do i = 1,ix
qq_add(i) = qq(i) + 1
enddo
return
end subroutine add
f2py --fcompiler=gfortran -m f2py_test -c --f90flags='-O3' f2py_test.f90
Und. Stellen Sie sicher, dass Sie die Option "-c" hinzufügen und den Namen der zu kompilierenden Datei am Ende schreiben. Jede Option ist unten
---- compiler =
: fortran-Compilerspezifikation
---m
: Modulname bei Verwendung in Python (er muss nicht mit dem Dateinamen identisch sein)
---- f90flags =
: Vom fortran-Compiler verwendete Optionen
Gehen Sie wie folgt vor, wenn Sie f2py aus Python verwenden.
import f2py_test #Importieren Sie mit f2py kompilierte Module
import numpy as np
ix = 5
qq = np.zeros(ix) #Definieren Sie das Numpy-Array entsprechend
qq_add = f2py_test.add(qq,ix) #Rufen Sie die in f2py definierte Funktion auf
Da im fortran-Code definiertes "qq_add" als "intent (out)" festgelegt ist, wird es als Rückgabewert beurteilt und ist nicht im Argument der Funktion enthalten. Andererseits ist im obigen Code auch die Größe des Arrays "ix" als Argument der Funktion enthalten, aber in f2py wird die Größe des Arrays automatisch bestimmt und als optionale Variable verwendet, und dann automatisch "len (qq)". Es ersetzt `. Deshalb,
qq_add = f2py_test.add(qq)
Das Ergebnis ist das gleiche.
Bei der Analyse einer Folge von Numpys möchte ich die Barriere des Geistes mit f2py senken und die Analyse beschleunigen.
Recommended Posts