fortran ルーチンを呼び出す Python コードのプロファイルを作成したいと考えています。私はこの PSTATS に使用しますが、以下の例に示すように、PSTATS は fortran ルーチンに費やす時間を考慮していません。
Fortran モジュール (mod_fortran.f90):
module mod_fortran
IMPLICIT NONE
CONTAINS
SUBROUTINE sub_sleep(wtime)
INTEGER(kind = 4), intent(in) :: wtime !! in seconds
CHARACTER(len=9) :: cwtime
WRITE(cwtime, 100)wtime
write(*,*) cwtime
CALL system(cwtime)
100 FORMAT('sleep ',I3)
END SUBROUTINE sub_sleep
end module mod_fortran
fortran モジュール (test_fortran_pstats.py) を呼び出す Python スクリプト:
from mod_fortran import *
mod_fortran.sub_sleep(10)
プロファイリング統計を出力する Python スクリプト (analyse_pstats.py):
import pstats
ps = pstats.Stats('output.pstats')
ps.strip_dirs().sort_stats('tottime').print_stats(5)
チュートリアル (コンパイルと送信):
f2py -c -m mod_fortran mod_fortran.f90
time python -m profile -o output.pstats test_fortran_pstats.py
python analyse_pstats.py
結果:
$> time python -m profile -o output.pstats test_fortran_pstats.py
sleep 10
0.236u 0.080s 0:13.58 2.2% 0+0k 47280+240io 1pf+0w
$>python analyse_pstats.py
Fri Apr 3 11:51:02 2015 output.pstats
11170 function calls (10981 primitive calls) in 0.180 seconds
Fortran ルーチンが 10 秒間「スリープ」している間、Pstats は 0.180 秒しかカウントしません。