【问题标题】:Is there any benefit to assigning a view to same name vs to a new name in python?在python中将视图分配给同名与新名称有什么好处吗?
【发布时间】:2021-05-04 09:54:47
【问题描述】:

假设我在 python 对象上创建一个新视图,这是我需要的唯一视图。将其分配给新名称与覆盖原始名称之间有什么区别吗?如果是,哪个更可取?

例如,假设我有一些 numpy 数组 arr,并且只需要一些重新调整的版本。可以将新视图重新分配给arr,还是应该给它一个新名称?

为清楚起见的示例:

import numpy as np

# some array
arr = np.zeros([100, 1])

# option 1
arr = arr.reshape(10, 10)

# option 2
arr_newview = arr.reshape(10, 10)

【问题讨论】:

    标签: python numpy object memory pep8


    【解决方案1】:

    不,两者都是一样的,因为python中没有变量的预先声明。 Python 的工作方式与 C++ 或 java 等其他编程语言完全不同。 当我们将任何变量分配给它实际指向特定数据的变量时,Python 变量分配就像指针一样工作。

    【讨论】:

      【解决方案2】:

      这完全有助于轻松访问。 同样,调试它的问题也会更少。 除了对大规模编程的这两个主要好处之外,为名称分配新视图没有其他好处

      【讨论】:

        【解决方案3】:

        这是非常基于意见的,但我不同意现有的答案。

        我喜欢保留旧名称,并为转换的每个步骤创建新的、长的、描述性的名称。它有时在调试时很有帮助,并允许您查看数据转换的中间步骤,我喜欢我的思维过程。它还有助于使代码更加“自我记录”。

        然而,创建新名称的主要缺点是它维护对旧数据的引用,这将阻止垃圾收集器释放它。如果你用一个新对象覆盖arr 引用,那么之前arr 引用的旧对象现在可以被释放(假设arr 是它的唯一引用)。我不会担心这一点,除非您正在处理大量数据并发现这是一个真正的问题。做对你更有意义的事,除非你有理由相信它会成为一个问题。


        但是,在这个特定的示例中,如果reshape 本质上返回了对arr 已经持有的同一对象的引用,则不会有功能差异。做对你最有意义的事。

        【讨论】:

        • 您首选方法的另一个缺点是您必须想出的名称数量。我倾向于重复使用名称,除非我看到创建新名称有好处...
        • @Vinzent 我认为这是一个优势!类似于想出好的函数名如何帮助您思考函数的严格目的是什么,想出好的变量名迫使您实际考虑行的目的是什么,并且如上所述,使代码自我- 记录。我同意这样的信念,如果你不能想出一个好名字,你可能对你正在写的东西有一个不完整的想法,或者你试图一次做太多事情。我会定期重命名函数和变量,直到一切顺利为止。
        • 我同意你的观点,但是在我编写的代码中(科学计算/使用 numpy 的大量数学)我经常会得到需要分成 5-10 行的单行代码并且这些子行本身都没有任何意义,但只能使行长 1000 个字符。在这种情况下,“如果你不能想出一个好名字,你可能对你正在写的东西有一个不完整的想法,或者你试图一次做太多事情”这不是一个有效的论点。当 f.ex. 时,通常情况并非如此。定义大系数矩阵等。
        • OP 特别提到分配numpyview。因此,即使重新分配,原始数据缓冲区仍然存在。原始数组的“其余部分”可能会被释放,但这是很小的内存使用。
        • @hpaulj 啊,我在阅读reshape 的文档时错过了这一点。似乎它必然返回一个新对象,但我发现事实并非如此。我会更新的。
        猜你喜欢
        • 2010-11-12
        • 1970-01-01
        • 1970-01-01
        • 2012-02-06
        • 2017-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-05
        相关资源
        最近更新 更多