পান্ডা থেকে আইট্রো ব্যবহার করার সময় আমি খুব খারাপ পারফরম্যান্স লক্ষ্য করেছি।
এটি কি এমন কিছু যা অন্যরা অভিজ্ঞ হয়? এটি কি ইরোরোর সাথে নির্দিষ্ট এবং কোনও নির্দিষ্ট আকারের ডেটার জন্য এই ফাংশনটি এড়ানো উচিত (আমি ২-৩ মিলিয়ন সারি নিয়ে কাজ করছি)?
গিটহাবের এই আলোচনাটি আমাকে বিশ্বাস করতে পরিচালিত করেছিল যে ডেটাফ্রেমে ডাইপিকে মিশ্রিত করার সময় এটি ঘটেছিল, তবে নীচের সরল উদাহরণটি দেখায় যে এটি একটি ডিজাইপ (ফ্লোট 64) ব্যবহার করার পরেও সেখানে রয়েছে। এটি আমার মেশিনে 36 সেকেন্ড সময় নেয়:
import pandas as pd
import numpy as np
import time
s1 = np.random.randn(2000000)
s2 = np.random.randn(2000000)
dfa = pd.DataFrame({'s1': s1, 's2': s2})
start = time.time()
i=0
for rowindex, row in dfa.iterrows():
i+=1
end = time.time()
print end - start
কেন ভেক্টরাইজড অপারেশনগুলি এত তাড়াতাড়ি প্রয়োগ হয়? আমি ভাবছি সেখানেও সারি পুনরাবৃত্তির দ্বারা কিছুটা সারি থাকতে হবে।
আমার ক্ষেত্রে কীভাবে এটিরোগগুলি ব্যবহার করবেন না তা আমি বুঝতে পারি না (এটি আমি ভবিষ্যতের প্রশ্নের জন্য সংরক্ষণ করব)। অতএব, আপনি যদি ধারাবাহিকভাবে এই পুনরাবৃত্তিটি এড়াতে সক্ষম হন তবে আমি শ্রবণকে প্রশংসা করব। আমি পৃথক ডেটাফ্রেমে ডেটা ভিত্তিক গণনা করছি। ধন্যবাদ!
--- সম্পাদনা করুন: আমি যা চালাতে চাই তার সরলীকৃত সংস্করণটি নীচে যুক্ত করা হয়েছে ---
import pandas as pd
import numpy as np
#%% Create the original tables
t1 = {'letter':['a','b'],
'number1':[50,-10]}
t2 = {'letter':['a','a','b','b'],
'number2':[0.2,0.5,0.1,0.4]}
table1 = pd.DataFrame(t1)
table2 = pd.DataFrame(t2)
#%% Create the body of the new table
table3 = pd.DataFrame(np.nan, columns=['letter','number2'], index=[0])
#%% Iterate through filtering relevant data, optimizing, returning info
for row_index, row in table1.iterrows():
t2info = table2[table2.letter == row['letter']].reset_index()
table3.ix[row_index,] = optimize(t2info,row['number1'])
#%% Define optimization
def optimize(t2info, t1info):
calculation = []
for index, r in t2info.iterrows():
calculation.append(r['number2']*t1info)
maxrow = calculation.index(max(calculation))
return t2info.ix[maxrow]
apply
ভেক্টরাইজড নয়।iterrows
এটি আরও খারাপ হিসাবে এটি সমস্ত কিছু বাক্স করে দেয় (যা 'পারফের সাথে পৃথক হয়apply
)। আপনারiterrows
খুব খুব কম পরিস্থিতিতে ব্যবহার করা উচিত । আইএমএইচও কখনও নয়। আপনি আসলে কী করছেন তা দেখানiterrows
।