R for循环与Python for循环性能

时间:2019-11-10 15:33:09

标签: python r performance for-loop

已经有关于此主题的讨论,但是他们并没有完全解决我的问题。事先对不起,如果他们这样做了,我没意识到。

这是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脚本?我很好奇。谢谢

1 个答案:

答案 0 :(得分:0)

R循环在2014年或15年期间曾经很慢,现在不再慢了,软件和编程语言会随着时间的推移而发展,永远不会成为现实。 JS是一个很好的例子。

R for循环并不慢,您可以在任何时候使用它们,但是R的垃圾收集器很慢,并且不应在循环内增长一个向量多次复制它。如果您避免使用该部件,那么您几乎总是可以安全地得到帮助

如果您需要提高循环速度或并行化速度,也可以尝试从data.table设置方法