Похоже, что операция конкатенации не является вашим настоящим узким местом. С помощью вашего метода я объединил 10 000 DataFrames с 50 строками каждый примерно за 22 секунды. Поэтому, если не происходит какой-то забавный материал, или ваши DataFrames очень широкие (я использовал только 1 столбец), лучшим вариантом может быть профилирование вашего кода (используя, например, pdb
), и найдите часть, которая действительно потребляет большинство ресурсов (что всегда должен быть вашим первым шагом при выполнении проблем с производительностью).
Однако, если вы уверены, что ваши конкатенации значительно замедляет вас, вы можете сначала написать все tmp
DataFrames в список Python и сцепить их все сразу после цикла:
import pandas as pd
def append1(n): # your method
out = pd.DataFrame()
for nb in range(n):
tmp = pd.DataFrame({"val": range(nb,50+nb)})
out = pd.concat([out,tmp],ignore_index='True',axis=0)
return out
def append2(n): # concatenate after loop
out = pd.DataFrame()
tmp_list = []
for nb in range(n):
tmp = pd.DataFrame({"val": range(nb,50+nb)})
tmp_list.append(tmp)
out = pd.concat(tmp_list,ignore_index='True',axis=0)
return out
воздействие
Производительность:
%timeit append1(10000)
1 цикл, лучшие из 3: 22,4 с на петле
%timeit append2(10000)
1 петля, лучшая из 3: 4.15 с за петлю
Я не знаю, проводите ли вы большую часть своего времени в функции 'concat', но вы можете попробовать' out = out.append (tmp, ignore_index = True) ' – cncggvg
У меня такой же результат с append :( – slimoo