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?