我刚刚使用 F2PY 将 Fortran 90 子例程包装到 python 中。这里的微妙之处在于 Fortran 子例程也将 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 函数非常耗时,那么有什么方法可以提高包装模块的速度吗?