Память объявленной переменной и время, определенное при вызове функции - PullRequest
1 голос
/ 01 октября 2019

Итак, у меня есть общий вопрос, но, поскольку я пишу на Python, это тег.

Предположим, у меня есть df, который является фреймом данных для панд - я обычно делал бы:

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

вместо

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

но тогда я подумал: если память - это проблема (а не скорость), будет ли второй путь лучше первого? Я предполагаю, что cosine_similarity должен вычислить df.T для того, чтобы использовать его, таким образом, используя вдвое больше памяти (имея в памяти и df, и df.T, до тех пор, пока не будет выполнено вычисление.

Я прав или как именно это сделать?

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

Из источника

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. В вашем случае вы этого не сделали. Если нет, то Y будет таким же, как X. Как при указании на ту же ячейку памяти. cosine_similarity, похоже, отлично справляется с памятью.


Однако это не так. Вы создаете совершенно новый фрейм данных df.T без необходимости. Сделайте это вместо этого.

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

Таким образом, вы указываете на массив Numpy, который лежит в основе фрейма данных. Это не должно быть создание нового объекта. Затем транспонирование этого массива также должно указывать на те же значения в памяти. Кроме того, я не уверен в этом на 100%, но это мои лучшие рассуждения на данный момент.

0 голосов
/ 01 октября 2019

В обоих случаях вычисляется df.T (как бы то ни было). Единственное отличие состоит в том, что в вашем первом коде результат связан с параметром cosine_similarity, а во втором - с именем df, которое в настоящее время находится в области видимости. В обоих случаях результат pd.DataFrame затем связывается с df.

. Единственная разница в использовании памяти будет , когда исходное значение df будет собирать мусор (если это вообще так), так как ваш первый код переназначает df позже, чем ваш второй код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...