Das Festlegen von Werten für die Pandas DataFrame-Teilmenge (Kopie) ist langsam

import timeit
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.rand(10, 10))

dft = df[[True, False] * 5]
# df = dft
dft2 = dft.copy()

new_data = np.random.rand(5, 10)

print(timeit.timeit('dft.loc[:, :] = new_data', setup='from __main__ import dft, new_data', number=100))
print(timeit.timeit('dft2.loc[:, :] = new_data', setup='from __main__ import dft2, new_data', number=100))

Auf meinem Laptop Einstellungswerte indft (die ursprüngliche Teilmenge) ist etwa 160-mal langsamer als das Festlegen von Werten indft2 (eine tiefe Kopie vondft).

Warum ist das so?

Bearbeite: Spekulationen über Proxy-Objekte wurden entfernt.

As c. Leder deutet darauf hin, dass dies wahrscheinlich auf einen anderen Codepfad zurückzuführen ist, wenn Werte für eine Kopie festgelegt werden dft) gegen einen Originaldatenrahmen dft2).

Bonus-Frage: Entfernen des Verweises auf den ursprünglichen DataFramedf (indem Sie das @ auskommentierdf = dft line), verringert den Geschwindigkeitsfaktor auf meinem Laptop auf ungefähr 2. Irgendeine Idee, warum dies der Fall ist?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage