Это нормально? Разве itertuples не должны вести себя как iterrows с точки зрения масштабирования с номером столбца, то есть с постоянным временем, а не с линейным временем?
Ниже прикреплен фрагмент кода, показывающий переход от itertuples() к iterrows() был самым быстрым способом выполнения итерации при увеличении ширины кадра данных.
Код: Выделить всё
import pandas as pd
import time
from pylab import *
size_range = [100, 300, 600, 1200]
nrows = 100000
compute_time_rows = zeros(len(size_range))
compute_time_tuples = zeros(len(size_range))
for s, size in enumerate(size_range):
x = pd.DataFrame(randn(nrows, size))
start = time.time()
for row in x.iterrows(): pass
stop = time.time()
compute_time_rows[s] = stop - start
start = time.time()
for row in x.itertuples(): pass
stop = time.time()
compute_time_tuples[s] = stop - start
xlabel('Dataframe width')
ylabel('Computation time [s]')
pd.Series(compute_time_rows, index=size_range).plot(grid=True, label='iterrows')
pd.Series(compute_time_tuples, index=size_range).plot(grid=True, label='itertuples')
title(f'Iteration over a {nrows} rows Pandas dataframe')
legend()
Подробнее здесь: https://stackoverflow.com/questions/791 ... ny-100-col