2

全て、

現在、パンダのパネルを使用してデータ ソースを保持しています。私のプログラムは単純なバックテスト エンジンです。個人的な楽しみのためだけですが、最適化に行き詰まっています。

アプリケーション全体を遅くしているコードは次のとおりです。

def get_generator(self):
    first_n = 0
    last_n = len(self.data_source.major_axis)
    cur_n = 0
    indices = self.data_source.major_axis
    while cur_n < last_n:
        yield self.data_source.ix[:, indices[first_n:cur_n + 1], :]
        cur_n += 1

ご覧のとおり、私は基本的に、世界のあらゆる瞬間に新しいビューを生成し、それを返しています。インデックスは単なる日付です。

このコードは、使用しようとしているデータの量に対して非常に遅いです。

これの速度を改善する方法を教えてください。

乾杯!

4

1 に答える 1

2
self.data_source.ix[:, :cur_n, :]

と同等です

self.data_source.ix[:, indices[first_n:cur_n + 1], :]

ただし、2〜3倍高速になる可能性があります。

In [105]: import pandas as pd    
In [106]: import numpy as np
In [107]: wp = pd.Panel(np.random.randn(2, 1000, 4))

In [108]: indices = wp.major_axis

In [109]: %timeit wp.ix[:, :499, :]
10000 loops, best of 3: 65.2 us per loop

In [110]: %timeit wp.ix[:, indices[0:500], :]
1000 loops, best of 3: 221 us per loop

In [114]: np.allclose(wp.ix[:, :499, :].values, wp.ix[:, indices[0:500], :].values)
Out[114]: True

self.data_source.ix[:, :cur_n, :]基本的なスライスを使用します。元のパネルのビューを返します。ビューを変更すると、元のパネルも変更されることに注意してください。

indices[first_n:cur_n + 1]NumPy の ndarray のサブクラスです。 ndarray でインデックスを作成すると、ビューではなくコピーが返されます。大きな配列のコピーを作成すると、ビューを返すよりも遅くなります。おそらく、速度向上の大部分はそこから来ています。ただし、元のパネルを変更せずに生成されたサブパネルを変更する場合など、コピーが必要になる場合があります。


転置を使用するという追加のアイデアを提供してくれた @Jeff に感謝します。私のマシンでは、大幅な改善が得られます。

In [131]: wpt = wp.transpose(1,0,2)

In [132]: %timeit wpt.ix[:499]
10000 loops, best of 3: 37.5 us per loop

In [109]: %timeit wp.ix[:, :499, :]
10000 loops, best of 3: 65.2 us per loop
于 2013-05-21T00:19:05.713 に答える