Установка значений в подмножестве Pandas DataFrame (копия) медленная

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)) 

На настройках моего ноутбука в dft (исходное подмножество) примерно в 160 раз медленнее, чем заданные значения в dft2 (глубокая копия dft ).

Изменить : Удалены спекуляции о прокси-объектах.

Как c. кожа предполагает, что это, вероятно, связано с другой кодировкой при установке значений на копии ( dft ) по сравнению с исходным dft2 ( dft2 ).

Это верно? Любые мысли или объяснения?

Бонусный вопрос: удалив ссылку на исходный DataFrame df (раскомментируя строку df = dft ), сокращает коэффициент скорости примерно до 2 на моем ноутбуке. Любая идея, почему это так?

One Solution collect form web for “Установка значений в подмножестве Pandas DataFrame (копия) медленная”

Это не совсем новый вопрос о SO. Это , и это связанные должности. Это ссылка на текущие документы, которые ее объясняют.

Комментарии от @ c.leather находятся на правильном пути. Проблема в том, что dft – это представление, а не копия dataframe df , как описано в связанных статьях. Но панды не могут знать, действительно ли это или нет, и если операция безопасна или нет, и, как таковая, выполняется много проверок, чтобы гарантировать безопасное выполнение задания, и этого можно было бы избежать просто сделав копию.

Это актуальная проблема, и в Github есть целая дискуссия. Я видел много предложений, которые мне больше всего нравятся, так что документы должны поощрять идиому df[[True,False] * 5].copy() , можно назвать ее df[[True,False] * 5].copy() slice & copy.

Я не смог найти точные проверки, и по проблеме github этот нюанс производительности упоминается только через некоторые твиты, которые некоторые разработчики отметили в поведении. Может быть, кто-то, кто больше участвует в разработке панд, может добавить немного больше информации.

  • Является ли бесперебойный сон причиной того, что моя программа Python работает очень медленно (и если да, то как я могу это решить?)?
  • Самый эффективный способ сделать заявление if-elif-elif-else, когда else сделан больше всего?
  • Производительность numpy.random.choice
  • Внесите MATLAB's im2col 'slide' в Python
  • Учет списка, карта и numpy.vectorize performance
  • как ускорить вычисление векторного перекрестного продукта
  • Почему IronPython быстрее, чем официальный интерпретатор Python
  • битовый массив python (исполнитель)
  • Python - лучший язык программирования в мире.