0

全部,

我目前正在尝试优化我为自己构建的一个小型回测应用程序的一些子程序。我有一个保存所有数据的“current_data”熊猫面板。

我正在尝试按如下方式访问它:

self.current_data.at[order['instrument'], self.current_day, 'low']

但是,这非常缓慢。从文档来看,这似乎应该返回一个视图——因为我没有设置任何值。我正在使用最新的熊猫(0.11.0)。

你能说出为什么会这样吗?也许有一种更快的方法来做到这一点?

顺便说一句,我知道这是一个副本,因为分析器显示每次都会调用 frame.py:383(init ),如果我减小对象的大小,这条线会大大加快速度。

干杯!

编辑:

这是重新创建我的问题的方法。我现在看到问题可能不在 .at 中。

items = ['A', 'B', 'C', 'D']
cols = ['a', 'b', 'c', 'd']


indices = pd.date_range(datetime.datetime.now(), periods=1000, freq="D")
res = {}
for item in items:
    res[item] = pd.DataFrame(np.random.randn(1000, 4), columns=cols, index=indices)

first = pd.Panel(res)

print timeit.Timer("""
for i in range(100, 200):
    today = indices[i]
    first_change = first.ix[:, :i + 1, :]
    first_change.at["A", today, "a"]
    first_change.at["A", today, "b"]
    first_change.at["A", today, "c"]
""", setup="from __main__ import first, indices").timeit(number=50)/50.0

#--- Time: 0.0307311664639

indices = pd.date_range(datetime.datetime.now(), periods=10000, freq="D")
res = {}
for item in items:
    res[item] = pd.DataFrame(np.random.randn(10000, 4), columns=cols, index=indices)
second = pd.Panel(res)

print timeit.Timer("""
for i in range(8100, 8200):
    today = indices[i]
    second_change = second.ix[:, :i + 1, :]
    second_change.at["A", today, "a"]
    second_change.at["A", today, "b"]
    second_change.at["A", today, "c"]
""", setup="from __main__ import second, indices").timeit(number=50)/50.0

#--- Time: 0848793384464

无论如何,这基本上是正在发生的事情。它可能在 .ix 函数中,但它只是返回一个视图,所以我不明白为什么需要更多时间。

我认为,那时问题可能不在 .at 中。

4

1 回答 1

0

你一定是在测量别的东西,at是一个常数时间的操作。请在您正在做的事情中显示更多细节(例如示例面板和访问器)

In [24]: p = Panel(randn(1,1,1))

In [25]: %timeit p.at[0,0,0]
100000 loops, best of 3: 5.33 us per loop

In [26]: p = Panel(randn(10,10,10))

In [27]: %timeit p.at[0,0,0]
100000 loops, best of 3: 5.34 us per loop

In [28]: p = Panel(randn(100,100,100))

In [29]: %timeit p.at[0,0,0]
100000 loops, best of 3: 5.28 us per loop

In [30]: p = Panel(randn(1000,1000,1000))

In [31]: %timeit p.at[0,0,0]
100000 loops, best of 3: 5.36 us per loop
于 2013-05-28T13:01:56.647 回答