【问题标题】:Memory of declared variable vs. when it is defined in function call声明变量的内存与在函数调用中定义时的对比
【发布时间】:2019-10-01 13:48:59
【问题描述】:

所以我有一个一般性问题,但由于我是用 Python 编写的,所以它是标签。

假设我有 df 这是一个熊猫数据框 - 我通常会这样做:

df=pd.DataFrame(data = cosine_similarity(df.T))

而不是

df=df.T
df = pd.DataFrame(data = cosine_similarity(df))

但后来我想:如果 memory 是问题(而不是速度),那么第二种方法会优于第一种吗?我假设cosine_similarity 必须计算df.T 才能使用它,因此使用了两倍的内存(dfdf.T 都存储在内存中),直到计算完成。

我是对的还是这到底是怎么做的?

【问题讨论】:

  • 没有。没有新的分配;你只是在改组显式引用。

标签: python pandas memory


【解决方案1】:

在这两种情况下,df.T 都会被计算出来(但是会发生这种情况)。唯一的区别是,在您的第一个代码中,结果绑定到cosine_similarity 的参数,而在第二个代码中,它绑定到当前范围内的名称df。在这两种情况下,pd.DataFrame 的结果都会绑定到df

内存使用的唯一区别是df 的原始值被垃圾回收(如果有的话),因为您的第一个代码重新分配df 的时间晚于您的第二个代码可以。

【讨论】:

    【解决方案2】:

    From Source

    X, Y = check_pairwise_arrays(X, Y)
    
    
    X_normalized = normalize(X, copy=True)
    if X is Y:
        Y_normalized = X_normalized
    else:
        Y_normalized = normalize(Y, copy=True)
    
    
    K = safe_sparse_dot(X_normalized, Y_normalized.T,
                        dense_output=dense_output)
    
    
    return K
    

    check_pairwise_arrays 确定您是否传递了Y。在你的情况下,你没有。如果不是,它使YX 相同。就像指向同一个内存位置一样。 cosine_similarity 似乎可以很好地处理内存。


    但是,你不是。您正在不必要地制作一个全新的数据框df.T。改为这样做。

    df = pd.DataFrame(cosine_similarity(df.to_numpy().T))
    

    这样,您将指向位于数据框基础的 Numpy 数组。这不应该是创建一个新对象。然后转置该数组也应该指向内存中的相同值。另外,我不确定这 100%,但这是我目前最好的推理。

    【讨论】:

    • 谢谢,我试试看,有记忆的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    相关资源
    最近更新 更多