#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
line_profiler показывает мне удивительный (для меня) результат, заключающийся в том, что обновление двух столбцов в одной строке выполняется быстрее как два оператора, а не как один комбинированный оператор.
Line # Hits Time Per Hit % Time Line Contents
==============================================================
696 6907 42029943.0 6085.1 4.7 df_work.loc[self.iRow, 'status'] = 'X'
697 6907 68856814.0 9969.1 7.7 df_work.loc[self.iRow, 'clock'] = self.dClock
698 6907 178155598.0 25793.5 19.9 df_work.loc[self.iRow, ['status', 'clock']] = ['L', self.dClock]
Строки 696 и 697 занимают в совокупности 11 секунд против 18 секунд для эквивалентной строки 698, поэтому 2 отдельных обновления выполняются на 40% быстрее, чем один оператор обновления. Я вижу этот шаблон неоднократно. Я предположил, что однократное обновление будет выполняться быстрее, и прежде чем я верну свой код обратно, я хочу проверить, существует ли еще более эффективный метод обновления по одному столбцу за раз в строке. Спасибо!
Ответ №1:
После дальнейших исследований решением было переключиться на iat вместо loc.
Line # Hits Time Per Hit % Time Line Contents
==============================================================
673 6907 5209397.0 754.2 1.7 df_work.iat[self.iRow, cols_work['clock']] = self.dClock
Время одного попадания уменьшилось с 9969 до 754.
Я инициализировал словарь, чтобы преобразовать имя столбца в номер столбца для использования с iat следующим образом:
cols_work = {}
for col in df_work.columns:
cols_work[col] = len(cols_work)