Есть ли другой вариант реализации данного примера Python3?
Есть ли другой вариант реализации данного цикла Python3?
import pandas as pd
import numpy as np
from itertools import product
from datetime import datetime
#замеряем скорость
start_time=datetime.now()
n_rows = 100
n_cols = 100
df1 = pd.DataFrame(np.random.randint(0, 100, size=(n_rows, n_cols)), columns=['col%d' % i for i in range(n_cols)])
df2 = pd.DataFrame(np.random.randint(0, 100, size=(n_rows, n_cols)), columns=['col%d' % i for i in range(n_cols)])
#1 Есть ли возможности повысить скорость цикла for или можно предложить другую реализацию.
#2 Получившийся результат положить в другой df.(сейчас не удобно, получившийся результат добавляется в тот же df2)
for x1, x2 in itertools.product(df1, df2):
df2['{0}_{1}'.format(x1,x2)] = df1[x1] + df2[x2]
# замеряем скорость
end_time = datetime.now()
print('Скорость выполнения скрипта: {}'.format(end_time - start_time))
In [12]:Скорость выполнения скрипта: 0:00:06.134649
Ответы (2 шт):
Автор решения: CrazyElf
→ Ссылка
Так сильно быстрее уже - через промежуточный словарь. Когда вы добавляете много раз колонки в один и тот же DataFrame - это очень медленная операция и тормозит в основном именно она. Кроме того, я беру сразу values, это тоже ускоряет сложение.
d = dict()
for x1, x2 in product(df1, df2):
d['{0}_{1}'.format(x1,x2)] = df1[x1].values + df2[x2].values
df3 = pd.DataFrame(d)
У меня раз в 20 таким образом при проверке в Google Colab всё ускорилось.
Если надо данные потом всё же в df2 поместить, то можно это легко сделать уже после создания df3.
Автор решения: VEL
→ Ссылка
Изначальный код выполнялся:
In [12]:Скорость выполнения скрипта: 0:00:06.134649
Предложенный код от @CrazyElf
d = dict()
for x1, x2 in itertools.product(df_1, df_2):
d['{0}_{1}'.format(x1,x2)] = df_1[x1] + df_2[x2]
df = pd.DataFrame(d)
In [13]:Скорость выполнения скрипта: 0:00:01.116014
Вот еще один вариант:
def pir(df_1, df_2):
pidx = np.indices((df_1.shape[1], df_2.shape[1])).reshape(2, -1)
cols = ['{0}_{1}'.format(col_1,col_2) for col_1 in df_1.columns for col_2 in df_2.columns]
return pd.DataFrame(df_1.values[:, pidx[0]] + df_2.values[:, pidx[1]], columns=cols)
df = pir(df_1, df_2)
In [14]:Скорость выполнения скрипта: 0:00:00.065824