2

いくつかのパフォーマンスの問題が発生しました。これを簡単に見ていただければ幸いです。

周波数ドメイン データを読み取っていますが、時間ドメインで開始周波数を補正するためのデータ キューブを作成する必要があります。

私が今これを行う方法は次のとおりです。

compdata = [[np.exp(t_range*sflist[y]) for y in x] for x in sfcube]

どこ

t_range = 1j*2*np.pi*time_axis_ns
time_axis_ns = np.array([x*delta_time_ns for x in xrange(number_of_points_for_fft)])
sflist = array([ 29500000.,  30500000.])

sfcube は、sflist のインデックスを持つ NxM 配列です。

compdata の計算は、現在私のプログラムの最も遅い部分です。最適化のアイデアはありますか?

4

5 に答える 5

1

マルチプロセッシング モジュールを使用して、すべての CPU コア (利用可能な場合は +HT) で並列化することで簡単に解決できます。

from multiprocessing import Pool
pool = Pool(16)  ## use total number of cores, x2 if HT is supported.

def f(y):
    return np.exp(t_range*sflist[y])

compdata = [pool.map(f, x) for x in sfcube] 

もちろん、これにより 4 倍から 16 倍の速度向上が得られます (コアの数によって異なります)。それでも、それでも十分でない場合は、ベクトル/行列演算でそれを行う方法を理解する必要があります。

于 2013-06-25T10:11:13.127 に答える
0

time_axis_nsまず、次を使用して配列を作成できます。

time_axis_ns = np.arange(number_of_points_for_fft)*delta_time_ns

次に、sfcube でインデックスを反復処理するのではなく、次のようにします。

sflist[sfcube]

同じ結果が得られるはずです。次にnp.exp(t_range*、この結果を実行します。

于 2013-06-25T10:12:18.913 に答える
0

インデックスの配列がある場合は、それを使用して計算をベクトル化できます。

In [1]: a = numpy.random.random((4,4))

In [2]: a
Out[2]: 
array([[ 0.08746418,  0.57716752,  0.85863208,  0.42931856],
       [ 0.90259153,  0.19590983,  0.73075288,  0.88976529],
       [ 0.71843135,  0.0169308 ,  0.98336314,  0.22227009],
       [ 0.93776916,  0.58943769,  0.55040806,  0.92192396]])

In [3]: a[0]
Out[3]: array([ 0.08746418,  0.57716752,  0.85863208,  0.42931856])

In [7]: index=[(0,1), (0,1)]

In [8]: a[index]
Out[8]: array([ 0.08746418,  0.19590983])

In [9]: a[index] = 100*a[index]

In [10]: a[index]
Out[10]: array([  8.74641837,  19.59098276])

これは通常、Python リストを使用するよりもはるかに高速です。a は最初から NumPy 配列であり、使用するインデックスは次の形式であることに注意してくださいa[list_of_rows, list_of_columns]

于 2013-06-25T10:09:07.040 に答える