numpyはFortranルーチンよりもはるかに高速なのはなぜですか?
シミュレーション(Fortranで記述)から温度分布を表す512 ^ 3配列を取得します。配列は、サイズが約1 / 2Gのバイナリファイルに保存されます。この配列の最小値、最大値、平均値を知る必要があります。とにかくFortranコードを理解する必要があるので、試してみることにし、次の非常に簡単なルーチンを思いつきました。 integer gridsize,unit,j real mini,maxi double precision mean gridsize=512 unit=40 open(unit=unit,file='T.out',status='old',access='stream',& form='unformatted',action='read') read(unit=unit) tmp mini=tmp maxi=tmp mean=tmp do j=2,gridsize**3 read(unit=unit) tmp if(tmp>maxi)then maxi=tmp elseif(tmp<mini)then mini=tmp end if mean=mean+tmp end do mean=mean/gridsize**3 close(unit=unit) 私が使用しているマシンでは、ファイルごとに約25秒かかります。それはかなり長いと私を驚かせたので、私は先に進んでPythonで次のことをしました: import numpy mmap=numpy.memmap('T.out',dtype='float32',mode='r',offset=4,\ shape=(512,512,512),order='F') mini=numpy.amin(mmap) maxi=numpy.amax(mmap) mean=numpy.mean(mmap) さて、もちろんこれはもっと速いと思っていましたが、本当に感動しました。同じ条件下で1秒もかかりません。平均は、私のFortranルーチンが見つけたもの(私も128ビットのfloatで実行したので、どういうわけかそれをもっと信頼しています)から外れていますが、有効数字の7桁程度にすぎません。 どうしてnumpyはこんなに速くなるのでしょうか?つまり、これらの値を見つけるには、配列のすべてのエントリを調べる必要がありますよね?私はFortranルーチンで非常に愚かなことをしているので、もっと時間がかかりますか? 編集: コメントの質問に答えるには: はい、32ビットと64ビットのfloatを使用してFortranルーチンを実行しましたが、パフォーマンスに影響はありませんでした。 iso_fortran_env128ビットのフロートを提供するものを使用しました。 …