F2PYを使用してFortran90サブルーチンをPythonにラップしました。ここでの微妙な点は、Fortranサブルーチンasloが引数の1つとしてPythonコールバック関数を使用することです。
SUBROUTINE f90foo(pyfunc, a)
real(kind=8),intent(in) :: a
!f2py intent(callback) pyfunc
external pyfunc
!f2py real*8 y,x
!f2py y = pyfunc(x)
!*** debug begins***
print *, 'Start Loop'
do i=1,1000
p = pyfunc(a)
end do
total = etime(elapsed)
print *, 'End: total=', total, ' user=', elapsed(1), ' system=', elapsed(2)
stop
!*** debug ends ***
これpyfunc
は私のPythonコードの他の場所で定義されているPython関数です。ラッパーは正常に動作しますが、上記のラップされたバージョンを実行すると、次のように純粋なPythonを使用して取得できる経過時間の約5倍の経過時間が得られました。
def pythonfoo(k):
""" k: scalar
returns: scalar
"""
print('Pure Python: Start Loop')
start = time.time()
for i in xrange(1000):
p = pyfunc(k)
elapsed = (time.time() - start)
print('End: total=%20f'% elapsed)
それで、問題は、オーバーヘッドは何から来るのかということです。pyfunc
純粋なFortran関数に再コーディングするのは非常に時間がかかるので、そのままにしておきたいのですが、ラッパーモジュールの速度を向上させる方法はありますか?