[英]Python Pandas: Why is numpy so much faster than Pandas for column assignment? Can I optimize further?
[英]why is python so much faster at editing column properties than r
我一直在使用 spotfire,並意識到我的 python 代碼編輯列屬性的速度比 r 代碼快得多。 r 代碼大約需要 24 秒,而 python 代碼大約需要 4 秒才能完成相同的操作。 我的 r 代碼是不是寫得不好才導致這種情況發生。
這是我的 python 代碼示例:
start=time.time()
count=0
names=[]
for i in olddt.Columns: #getting columns from old data table
names.append(i)
for i in dt.Columns: #assigning new values
if count<=4:
i.Properties["Limits.Whatif.Upper"]=1.0
i.Properties["Limits.Whatif.Lower"]=1.0
i.Properties["Limits.Prod.Upper"]=1.0
i.Properties["Limits.Prod.Lower"]=1.0
count=count+1
else:
i.Properties["Limits.Whatif.Upper"]=float(count-4)+26.0
i.Properties["Limits.Whatif.Lower"]=float(count-4)-39.0
i.Properties["Limits.Prod.Upper"]=names[count-4].Properties["Limits.Whatif.Upper"]+5.0
i.Properties["Limits.Prod.Lower"]=names[count-4].Properties["Limits.Whatif.Lower"]-4.0
count=count+1
print time.time()-start
這是我的 R 代碼:
for(col in 1:ncol(temp2)){
if (col<=4){
attributes(temp2[,col])$SpotfireColumnMetaData$upper=Inf
attributes(temp2[,col])$SpotfireColumnMetaData$lower=-1*Inf
attributes(temp2[,col])$SpotfireColumnMetaData$upper2=Inf
attributes(temp2[,col])$SpotfireColumnMetaData$lower2=-1*Inf
}
else{
names(attributes(dt[,col-4])$SpotfireColumnMetaData)<- lapply( names( attributes(dt[ ,col-4] )$SpotfireColumnMetaData), tolower)
attributes(temp2[,col])$SpotfireColumnMetaData$upper=2
attributes(temp2[,col])$SpotfireColumnMetaDatalower=1
attributes(temp2[,col])$SpotfireColumnMetaData$upper2=attributes(dt[,col-4])$SpotfireColumnMetaData$upper
attributes(temp2[,col])$SpotfireColumnMetaData$lower2=attributes(dt[,col-4])$SpotfireColumnMetaData$lower
}
}
我還使用了一個 lapply function 在這里看到:
applyLimits <- function(col){
if (count<4){
attributes(temp2[,col])$SpotfireColumnMetaData$upper<<-Inf
attributes(temp2[,col])$SpotfireColumnMetaData$lower<<- (-1*Inf)
attributes(temp2[,col])$SpotfireColumnMetaData$upper2<<-Inf
attributes(temp2[,col])$SpotfireColumnMetaData$lower2<<- (-1*Inf)
count<<-count+1
}
else{
attributes(temp2[,col])$SpotfireColumnMetaData$upper<<-2
attributes(temp2[,col])$SpotfireColumnMetaData$lower<<-1
attributes(temp2[,col])$SpotfireColumnMetaData$upper2<<-attributes(dt[,col-4])$SpotfireColumnMetaData$upper2
attributes(temp2[,col])$SpotfireColumnMetaData$lower2<<-attributes(dt[,col-4])$SpotfireColumnMetaData$lower2
count<<-count+1
}
}
lapply(1:ncol(temp),applyLimits)
如果有什么方法可以改進我的 r 代碼,請告訴我,但我還沒有看到更好的方法來調整它的屬性。 根據我所做的一些研究 temp2 和 dt 都應該是 data.frame
請記住 R 是矢量化語言,您的 lapply function 未矢量化。 為了獲得良好的性能,您需要 lapply 返回一個向量並在一個 go 中更新整個向量。 您的 function 一次更新一行和一列,這就是您性能不佳的原因。
矢量化方法將是四個 lapply 調用,每個調用更新一整列。 應該看起來像這樣:
applyLimits1 <- function(col){
count <<- count+1
if (count<4) Inf else 2
}
applyLimits2 <- function(col){
count <<- count+1
if (count<4) (-1*Inf) else 1
}
applyLimits3 <- function(col){
count <<- count+1
if (count<4) Inf else attributes(dt[,col-4])$SpotfireColumnMetaData$upper2
}
applyLimits4 <- function(col){
count <<- count+1
if (count<4) (-1*Inf) else attributes(dt[,col-4])$SpotfireColumnMetaData$lower2
}
count <- -1
attributes(temp2[,col])$SpotfireColumnMetaData$upper <- lapply(1:ncol(temp),applyLimits1)
count <- -1
attributes(temp2[,col])$SpotfireColumnMetaData$lower <- lapply(1:ncol(temp),applyLimits2)
count <- -1
attributes(temp2[,col])$SpotfireColumnMetaData$upper2 <- lapply(1:ncol(temp),applyLimits3)
count <- -1
attributes(temp2[,col])$SpotfireColumnMetaData$lower2 <- lapply(1:ncol(temp),applyLimits4)
我沒有要測試的數據,我剛剛粘貼了您的代碼。 使用 sapply 或 vapply 可能會更好。 當然,有些語言比其他語言更適合某些任務......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.