Tôi đã nhận thấy hiệu suất rất kém khi sử dụng thuốc mọc từ gấu trúc.
Đây có phải là điều mà những người khác đã trải qua? Nó có dành riêng cho ngứa và có nên tránh chức năng này đối với dữ liệu có kích thước nhất định (tôi đang làm việc với 2-3 triệu hàng) không?
Cuộc thảo luận này trên GitHub khiến tôi tin rằng nó được gây ra khi trộn các loại dtype trong dataframe, tuy nhiên, ví dụ đơn giản bên dưới cho thấy nó có ở đó ngay cả khi sử dụng một loại dtype (float64). Quá trình này mất 36 giây trên máy của tôi:
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
Tại sao các thao tác vectơ như áp dụng nhanh hơn nhiều? Tôi tưởng tượng cũng phải có một số lần lặp lại từng hàng ở đó.
Tôi không thể tìm ra cách để không sử dụng iterrows trong trường hợp của mình (điều này tôi sẽ để dành cho một câu hỏi trong tương lai). Vì vậy, tôi sẽ đánh giá cao sự lắng nghe nếu bạn luôn có thể tránh được sự lặp lại này. Tôi đang tính toán dựa trên dữ liệu trong các khung dữ liệu riêng biệt. Cảm ơn bạn!
--- Chỉnh sửa: phiên bản đơn giản của những gì tôi muốn chạy đã được thêm vào bên dưới ---
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
KHÔNG được vector hóa.iterrows
thậm chí còn tệ hơn vì nó đóng hộp mọi thứ (đó là 'sự khác biệt hoàn hảo vớiapply
). Bạn chỉ nên sử dụngiterrows
trong rất ít trường hợp. IMHO không bao giờ. Hiển thị những gì bạn đang thực sự làm vớiiterrows
.