<pre><code>import pandas as pd
import random
import time
import numpy as np
import itertools as it
def f(a,b,c,d):
return int(a+b+c+d)
df1 = pd.DataFrame(np.random.rand(100,3))
df2 = pd.DataFrame(np.random.rand(100,6))
df3 = pd.DataFrame(np.random.rand(100,3))
df = pd.DataFrame(np.random.rand(100,1))
out = pd.DataFrame()
#till here we created the random data frames
start = time.time()
count = 0
for index,row in df.iterrows():
for i in range(6):
for j in range(3):
for k in range(3):
out.loc[index, count] = f(df1.at[index,k], df2.at[index,i], df3.at[index,j], row[0])
count+=1
print(time.time()-start)
# for 100 rows time is +- 11 seconds
start1 = time.time()
out1 = pd.DataFrame()
for i,r in df.iterrows():
tmp = []
tmp.append(list(df1.loc[i])) #add each row as a list to tmp
tmp.append(list(df2.loc[i]))
tmp.append(list(df3.loc[i]))
tmp.append([r[0]])
all_comb = list(it.product(*tmp)) # create a list of all possible combinations from tmp
count = 0
for comb in all_comb:
out1.loc[i,count] = f(*comb) #send combinations to same function
count+=1
print(time.time()-start1)
#for 100 rows time is 0.8 seconds
print(len(out))
print(len(out1))
</code></pre>