私のpythonスクリプトの1つがgfortranと比較して約4倍遅い理由を理解しようとしていますが、これにたどり着きました:
import numpy as np
nvar_x=40
nvar_y=10
def fn_tst(x):
for i in range(int(1e7)):
y=np.repeat(x,1+nvar_y)
return y
x = np.arange(40)
y = fn_tst(x)
print y.min(),y.max()
これは、次の fortran コードよりも約 13 倍遅いです。
module test
integer,parameter::nvar_x=40,nvar_y=10
contains
subroutine fn_tst(x,y)
real,dimension(nvar_x)::x
real,dimension(nvar_x*(1+nvar_y))::y
do i = 1,10000000
do k = 1,nvar_x
y(k)=x(k)
ibeg=nvar_x+(k-1)*nvar_y+1
iend=ibeg+nvar_y-1
y(ibeg:iend)=x(k)
enddo
enddo
end subroutine fn_tst
end module test
program tst_cp
use test
real,dimension(nvar_x)::x
real,dimension(nvar_x*(1+nvar_y))::y
do k = 1,nvar_x
x(k)=k-1
enddo
call fn_tst(x,y)
print *,minval(y),maxval(y)
stop
end
Python スクリプトを高速化する方法を教えてください。また、numpy を使用した優れたパフォーマンスへの他の指針もいただければ幸いです。Fortran ルーチン用の Python ラッパーをビルドするよりも、Python に固執したいと思います。
ありがとう
@isedev、それで、これですか。1.2s gfortran 対 Python の 6.3s? パフォーマンスについて心配したのはこれが初めてですが、前述したように、高速化しようとしていたコードで Python を使用すると、gfortran の約 4 分の 1 の速度しか得られませんでした。
そうです、申し訳ありませんが、コードは同じことをしていませんでした。実際、ループで示していることは、元のコードにあるものに似ています。
何かが欠けていない限り、最後のステートメントに同意しません: fn_tst で y を作成する必要があります。np.repeat は RHS の用語の 1 つにすぎません (o/p を既存の配列に直接配置します)。np.repeat 用語をコメントアウトすると、高速になります...
rhs_slow = rhs[:J]
rhs_fast = rhs[J:]
rhs_fast[:] = c* ( b*in2[3:-1] * ( in2[1:-3] - in2[4:] ) - fast) + hc_ovr_b * np.repeat(slow,K) #slow