R for-loop против производительности Python for-loop - PullRequest
0 голосов
/ 10 ноября 2019

На эту тему уже есть некоторые обсуждения, но они не совсем отвечают на мой вопрос. Извините заранее, если они это сделают, а я не понял.

Вот две простые установки для цикла for R и python -

R for-loop (на моем компьютере потребовалось 3,41 с):

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.87 на моем компьютере):

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 более чем в 5 раз быстрее, чем Python. Этого следовало ожидать? Я видел, что цикл for в Python быстрее, чем в R, если только вы не используете R, в этом случае R побеждает в Python, если число шагов больше 1000 (https://datascienceplus.com/loops-in-r-and-python-who-is-faster/),, но это не то, что я вижу здесь (яя не использую lapply.) Может ли скрипт Python быть улучшен без использования декораторов, магических функций, генераторов и т. д. Мне просто любопытно. Спасибо

1 Ответ

0 голосов
/ 12 ноября 2019

R-циклы раньше были медленными в течение 2014 или 15 годов. Они больше не медленные, программное обеспечение и язык программирования развиваются с течением времени, и вещи никогда не бывают верными вечно. JS - прекрасный пример этого.

R для циклов не медленны, и вы можете использовать их в любое время, однако сборщик мусора в R медленен, и вы не должны выращивать вектор внутри цикла, который копирует егонесколько раз. Если вы избегаете этой части, вы почти всегда в надежных руках

И вы также можете попробовать установить метод из data.table, если вам нужна большая скорость из цикла или распараллелить его

...