我正在创建一个“实时”流程,该流程从SierraChart更新的专有格式化OHLCVTBA文件中获取数据。使用生成器读取数据并创建数据框的代码已发布on pastebin
我意识到我的结构(新数据驱动)是错误的,我即将重组它。 PhE's question and Wes's response让我朝着填充预先填充的数据框架的方向发展。我的问题是:
将数据帧和指针保存为全局变量或将它们传递给使用它们的各种函数是否更快?此外,还有其他考虑应该推动这一选择吗?
感谢。
答案 0 :(得分:5)
Local variables are faster to access than global variables in python
在pandas的上下文中,这意味着你应该将变量传递给有意义的函数(这意味着它们可以在函数内更快地找到)。相反,python中的函数调用很昂贵(如果你调用它们很多),这就是为什么numpy / pandas尽可能使用向量化函数。 显然,如果你在一个函数内部做事,你必须小心确保所有计算都在现场完成。
在担心速度之前,我通常会以“pythonic”/“pandastic”的方式让事情先行。然后使用%timeit
并查看它是否足够快(通常是)。添加unittest(s)。调整速度,%timeit
,%prun和%timeit
等等。如果这是一个大项目vbench。
答案 1 :(得分:2)
您需要对其进行分析,但我的猜测是,如果存在任何显着差异,则支持全局变量。引用仍然在内存中,并且不会发生引用计数。
(编辑:无论如何,请参阅@Andy Hayden关于其相对访问时间的链接,以及链接here,其中表示局部变量要快得多。)
主要考虑的是“软件工程” - 使用全局数据是bad idea,因为很难跟踪它何时何地被改变。当然,如果你不能满足要求(运行时),那么必须要做;但为了了解它 - 首先衡量。
无论如何,我会推荐一个不同的解决方案 - 将这些数据保存在一个类中。它将花费更多的字典查找(第一个查找是变量名称,它仍然发生;第二个是类dict中的查找),但它可能比传递许多对象更有效,并将有助于组织你的计划。