已经有关于此主题的讨论,但是他们并没有完全解决我的问题。事先对不起,如果他们这样做了,我没意识到。
这是R和python中的两个简单的for循环设置-
R for循环(在我的计算机上为3.41s):
datafr <- matrix(0,nrow=24*365,ncol=15)
matrix3d <- array(0,dim=c(24*365,12,7))
#================
start_time <- Sys.time()
for (p in 1:150) {
for (m in 1:2) {
l <- rep(0.7*runif(365),each=24)
a <- rep(0.7*runif(365),each=24)
pp <- 1+floor(15*runif(7))
for (j in 1:7) {
bun <- datafr[,pp[j]]*a
for (h in 2:(24*365)) {
matrix3d[h,m,j] <- matrix3d[h-1,m,j]*l[h] + bun[h]
}
}
}
}
Sys.time() - start_time
#================
#took 3.41s on my computer
这是Python中的相同代码(在我的计算机上#took 17.87s):
import numpy as np
import time
import pandas as pd
datafr= pd.DataFrame(0, index=range(24*365),columns=range(15))
matrix3d = np.zeros((24*365,12,7))
#=============
start_time = time.time()
for p in range(150):
for m in range(2):
l = np.repeat(0.7*np.random.random(365),24)
a = np.repeat(0.7*np.random.random(365),24)
pp = 1+np.floor(15*np.random.random(7))
for j in range(7):
bun = np.asarray(datafr.iloc[:,int(pp[j])-1],dtype=np.float32)*a
for h in range(1,(24*365)):
matrix3d[h,m,j] = matrix3d[h-1,m,j]*l[h]+bun[h] #bottleneck
round(time.time() - start_time,2)
#================
#took 17.87s on my computer
R比Python快5倍以上。这是可以预期的吗?我看到Python的for循环比R的快,除非您使用R的lapply,在这种情况下,如果步数大于1000(https://datascienceplus.com/loops-in-r-and-python-who-is-faster/)则R胜过Python,但这不是我在这里看到的(I不使用lapply)。是否可以通过不使用装饰器,魔术函数或生成器等的方式来改进Python脚本?我很好奇。谢谢
答案 0 :(得分:0)
R循环在2014年或15年期间曾经很慢,现在不再慢了,软件和编程语言会随着时间的推移而发展,永远不会成为现实。 JS是一个很好的例子。
R for循环并不慢,您可以在任何时候使用它们,但是R的垃圾收集器很慢,并且不应在循环内增长一个向量多次复制它。如果您避免使用该部件,那么您几乎总是可以安全地得到帮助
如果您需要提高循环速度或并行化速度,也可以尝试从data.table设置方法