На эту тему уже есть некоторые обсуждения, но они не совсем отвечают на мой вопрос. Извините заранее, если они это сделают, а я не понял.
Вот две простые установки для цикла 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 быть улучшен без использования декораторов, магических функций, генераторов и т. д. Мне просто любопытно. Спасибо