Python Leicht zu schreiben, aber schnell ~ → Engpass ist modularisiert fortran !! !! !! schnell! !! !!
Lassen Sie uns das zuvor geschriebene Programm zur Anzeige von Primzahlen modularisieren, das auch Fortran als Übung dient.
f2py (im Lieferumfang von scipy enthalten) gfortran4.7.2
Bereiten Sie eine Datei vor, die das Unterprogramm beschreibt, das Sie modularisieren möchten. Das Argument des Unterprogramms deklariert sich mit Cf2py. Der Rückgabewert der Unterroutine (dh der auf der Python-Seite empfangene Rückgabewert) wird mit Cf2py deklariert. Wenn Sie die Cf2py-Deklaration nicht am Zeilenanfang schreiben und 6 Leerzeichen im Skriptkörper öffnen, tritt ein Kompilierungsfehler auf. Anscheinend muss ich es nach Cf2py indental schreiben (es ist nervig !!)
primepy.f90
subroutine prime_number(max_num, ret)
implicit none
integer max_num
integer ret(max_num)
integer i, j, list(max_num)
Cf2py intent(in) max_num
Cf2py intent(out) ret
!setze l
do i=1, max_num, 1
list(i) = i
enddo
list(1) = 0
!Stellen Sie eine Primzahl ein
do i=1, max_num, 1
if (.not. list(i) == 0) then
do j = i*2, max_num, i
list(j) = 0
end do
endif
enddo
!Gibt eine Liste von Primzahlen zurück
do i=1, max_num, 1
ret(i) = list(i)
enddo
end subroutine prime_number
f2py -c --fcompiler=gfortran -m prime primepy.f90
Kompilieren Sie mit -c
Geben Sie den Compiler mit --fcompiler an
Ausgabedatei nach -m
Zum Schluss die Fortran-Programmdatei
Dann überprüfen Sie die Hilfe mit -h
Erfolg, wenn die Datei prime.so erstellt wird.
Mit einem Python-Interpreter
>>> import prime
>>> a = prime.prime_number(100)
>>> a
array([ 0, 2, 3, 0, 5, 0, 7, 0, 0, 0, 11, 0, 13, 0, 0, 0, 17,
0, 19, 0, 0, 0, 23, 0, 0, 0, 0, 0, 29, 0, 31, 0, 0, 0,
0, 0, 37, 0, 0, 0, 41, 0, 43, 0, 0, 0, 47, 0, 0, 0, 0,
0, 53, 0, 0, 0, 0, 0, 59, 0, 61, 0, 0, 0, 0, 0, 67, 0,
0, 0, 71, 0, 73, 0, 0, 0, 0, 0, 79, 0, 0, 0, 83, 0, 0,
0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 97, 0, 0, 0], dtype=int32)
Wasser
Ich konnte mir keinen einfachen Weg vorstellen, nur ungleich Null zurückzugeben, also ist dies auf der Python-Seite "a.take (a.nonzero () [0])".
Gerne den Engpass beseitigen Wenn Sie mit fortran nicht verstehen, behandeln Sie es auf der Python-Seite! !! Die beste Liste von Python! !! !!
Recommended Posts