2

私は Matlab から numpy への飛躍を試みている最中ですが、fft の速度がどうしても必要です。これでpyfftwのことはわかりましたが、きちんと使っているかはわかりません。私のアプローチは次のようになります

import numpy as np
import pyfftw
import timeit

pyfftw.interfaces.cache.enable()

def wrapper(func, *args):
    def wrapped():
        return func(*args)
    return wrapped

def my_fft(v):
    global a
    global fft_object
    a[:] = v
    return fft_object()

def init_cond(X):
    return my_fft(2.*np.cosh(X)**(-2))

def init_cond_py(X):
    return np.fft.fft(2.*np.cosh(X)**(-2))

K = 2**16
Llx = 10.
KT = 2*K
dx = Llx/np.float64(K)
X = np.arange(-Llx,Llx,dx)

global a
global b
global fft_object
a = pyfftw.n_byte_align_empty(KT, 16, 'complex128')
b = pyfftw.n_byte_align_empty(KT, 16, 'complex128')
fft_object = pyfftw.FFTW(a,b)

wrapped = wrapper(init_cond, X)
print min(timeit.repeat(wrapped,repeat=100,number=1))

wrapped_two = wrapper(init_cond_py, X)
print min(timeit.repeat(wrapped_two,repeat=100,number=1))

ビルダー関数と、pyfftw を介した scipy および numpy fft 呼び出しへの標準インターフェイスがあることを感謝します。ただし、これらはすべて非常にゆっくりと動作しています。最初に fft_object のインスタンスを作成し、それをグローバルに使用することで、numpy の fft 呼び出しと同じかわずかに速い速度を得ることができました。

とはいえ、暗黙のうちに叡智が蓄えられているという前提で取り組んでいます。本当?それを明示する必要がありますか?もしそうなら、それを行う最善の方法は何ですか?

また、timeit は完全に不透明だと思います。私はそれを正しく使用していますか?リピートと呼ぶほどの知恵の蓄えでしょうか。あなたが与えることができるかもしれないどんな助けにも前もって感謝します.

4

1 に答える 1