【问题标题】:Python Pandas global vs passed variablePython Pandas 全局 vs 传递变量
【发布时间】:2013-05-31 12:20:43
【问题描述】:

我正在创建一个“实时”进程,该进程从由 SierraChart 更新的专有格式 OHLCVTBA 文件中获取数据。读取数据并使用生成器创建数据框的代码发布在 pastebin 上。 [删除死链接]。

我意识到我的结构(新数据驱动)是错误的,我即将对其进行重组。 PhE's question and Wes's response 带我去填充一个运行良好的预填充数据框。我的问题是:

将我的数据框和指针作为全局变量保存或将它们传递给使用它们的各种函数是否更快?此外,是否还有其他考虑因素可以推动这一选择?

谢谢。

【问题讨论】:

    标签: python pandas sierrachart


    【解决方案1】:

    Local variables are faster to access than global variables in python.

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

    在担心速度之前,我通常会先以“pythonic”/“pandastic”的方式让事情顺利进行。然后使用%timeit 看看它是否足够快(通常是这样)。添加一个单元测试。调整速度,%timeit、%prun 和 %timeit 更多。如果是大项目vbench.

    【讨论】:

    • 这很好,但没有考虑到许多变量的传递(当然,分析会)。
    • @Elazar 是真的......否则你可能会在黑暗中拍摄:)(而不是瞄准最慢的东西。)
    • 谢谢安迪。我已将我的代码转换为类表单,并将添加一个可选的核心进程时间日志,以确认进程在数据的时间范围内运行。 Here's the updated version 这些课程确实使它更清晰,更易于维护,所以当我到达那个阶段时检查时间会很有趣。
    【解决方案2】:

    您需要对其进行分析,但我的猜测是,如果有任何显着差异,那么它有利于全局变量。引用仍在内存中,不会发生引用计数。

    (编辑:无论如何,请参阅 @Andy Hayden 的链接了解它们的相对访问时间,以及链接 here,它说局部变量要快得多)。

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

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

    【讨论】:

    • 感谢您的回复。好的。我将设置一个简单的 1000x 版本并使用 iPython 对其进行分析。 --- 关于类 - 如果我在一个类中设置它,包括 DF、指针等,我不会仍然有相同的开销,而是一个更漂亮的面向 oo 的结构(这可能是足够的理由这样做) ?
    • 它会像传递一个单一的对象,而不是很多(如果这是你的问题)。是的,它将花费两次字典查找而不是一次。
    • 已测试:它为进程增加了 61ns 或为这些短函数增加了 0.2%,因此可以忽略不计。 i.imgur.com/Hzx4zwX.png
    • @John9631 好的,有道理。请记住,此测试适用于少量对象,这些对象将适合缓存。
    • 谢谢。我将构建为类(一个用于数据框,一个用于文件)并传递它们。如果我以后遇到问题,我总是可以回顾性地分解它们。我会替换负数 1,但我的代表还不够高。
    猜你喜欢
    • 2013-07-16
    • 1970-01-01
    • 2011-09-10
    • 2017-07-11
    • 2022-01-14
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多