2013-06-04 66 views
2

我正在创建一个“实时”进程,该进程从SierraChart更新的专有格式化OHLCVTBA文件中获取数据。读取数据并使用生成器创建数据帧的代码已发布on pastebinPython Pandas全局vs传递变量

我已经意识到我的结构(新数据驱动)是错误的,而且我即将对其进行重新组织。 PhE's question and Wes's response已经使我填补了预填充数据框的工作方向。我的问题在于:

将数据框和指针保持为全局变量或将它们传递给使用它们的各种函数会更快吗?此外,还有其他的考虑是否应该推动这一选择?

谢谢。

回答

5

Local variables are faster to access than global variables in python

在大熊猫的情况下,这意味着你应该应该将变量传递到函数中,这是有意义的(这意味着它们可以在函数内部找到更快)。相反,python中的函数调用非常昂贵(如果你要调用它们),这就是为什么numpy/pandas尽可能使用向量化函数的原因。 显然,如果你在一个函数内部做事,你必须小心以确保所有的计算都在原地完成。

我通常会首先以“pythonic”/“pandastic”方式工作,然后再担心速度。然后使用%timeit并查看它是否已经足够快(通常是)。添加一个unittest(s)。调整速度,%timeit,%prun和%timeit一些。如果这是一个大项目vbench

+0

这很好,但没有考虑到许多变量的传递(当然,分析将会)。 – Elazar

+0

@Elazar这是真的......否则你可以在黑暗中拍摄:)(而不是瞄准最慢的东西。) –

+0

谢谢安迪。我已将我的代码转换为类形式,并将添加核心进程时间的可选日志,以确认进程在数据时间内运行。 [这是更新的版本](http://pastebin.com/Gyy6MNu3) 这些类使它更清晰和更容易维护,因此检查我到达该阶段的时间会很有趣。 –

2

您需要对其进行配置,但我的猜测是,如果有任何显着差异,它是赞成全局。该引用仍在内存中,并且不会发生引用计数。 (编辑:无论如何,请参阅@Andy Hayden关于他们的相对访问时间的链接,以及链接here,它表示局部变量要快得多)。

主要考虑的是“软件工程” - 使用全局数据是一个bad idea,因为它很难随时随地进行更改。当然,如果你不能满足要求(运行时),那么它必须完成;但为了知道它 - 首先测量

无论如何,我会推荐一个不同的解决方案 - 将这些数据保存在一个类中。它将花费更多的字典查找(第一次查找是变量名称,它无论如何都会发生;第二次是在类词典中的查找),但它可能比传递许多对象更有效,并且会帮助组织你的程序。

+0

感谢您的回复。好。我将设置一个简单的1000x版本并使用iPython进行配置。 --- 关于类 - 如果我在包括DF,指针等的类中设置它,我不会有相同的开销,而是一个更漂亮的oo定向结构(这可能是足够的原因去做吧)? –

+0

它会像一个单独的对象传递,而不是许多(如果这是你的问题)。是的,它将花费两次字典查找而不是一次。 – Elazar

+0

测试: 它增加了61ns的过程或0.2%这些短的功能 所以它是微不足道的。 http://i.imgur.com/Hzx4zwX。png –