Установка значений в подмножестве 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 этот нюанс производительности упоминается только через некоторые твиты, которые некоторые разработчики отметили в поведении. Может быть, кто-то, кто больше участвует в разработке панд, может добавить немного больше информации.

  • Самый быстрый способ увеличить числовой числовой массив
  • PerformanceWarning - Pandas и Pytables, могу ли я исправить это?
  • Запись огромных строк в python
  • Как ускорить этот код Python?
  • Как работают курсоры в DB-API Python?
  • Эффективное создание массивов numpy из понимания списка и в целом
  • Почему pow (a, d, n) намного быстрее, чем ** d% n?
  • Производительность: Python pandas DataFrame.to_csv добавляется постепенно медленнее
  • Разница между производительностью или стилем между «if» и «if not»?
  • Ускорьте миллионы регулярных выражений в Python 3
  • Почему numpy.array так медленно?
  • Python - лучший язык программирования в мире.