1 前言
筆者主力機(jī)是MBAM1芯片(8+256)
,某個下午鞏固循環(huán)突然思考到個問題,小循環(huán)很快就能run出來,中循環(huán)還勉勉強(qiáng)強(qiáng),稍微上點強(qiáng)度就運行的很慢。雖然是CPU占用100%,8顆核心好像是偷著懶跑的,但是丟給我那臺4核心8線程
黑蘋果,是跑滿的,說明ARM在多線程的時候,有點東西
下圖是計算一個10億內(nèi)訓(xùn)練模型時的top
:
2 幾個循環(huán)
2.1 100以內(nèi)的和
### for
sum <- 0
for (i in 1:100) {
sum <- sum + i
}
print(sum)
### while
sum <- 0
i <- 1
while (i <= 100) {
sum <- sum + i
i <- i + 1
}
print(sum)
2.2 100以內(nèi)奇數(shù)和/偶數(shù)和
### for
odd_sum <- 0
even_sum <- 0
for (i in 1:100) {
if (i %% 2 == 0) {
even_sum <- even_sum + i
} else {
odd_sum <- odd_sum + i
}
}
print(paste("奇數(shù)和:", odd_sum))
print(paste("偶數(shù)和:", even_sum))
### while
odd_sum <- 0
even_sum <- 0
i <- 1
while (i <= 100) {
if (i %% 2 == 0) {
even_sum <- even_sum + i
} else {
odd_sum <- odd_sum + i
}
i <- i + 1
}
print(paste("奇數(shù)和:", odd_sum))
print(paste("偶數(shù)和:", even_sum))
3 多重循環(huán)
以下僅記錄和提供思路,具體情況具體分析,但是有一點思維模式
很得益
3.1 向量化
假設(shè)計算兩個向量x和y的點積,使用for循環(huán)分別游歷,相乘再相加:
x <- c(1, 2, 3, 4, 5)
y <- c(5, 4, 3, 2, 1)
dot_product <- 0
for (i in 1:length(x)) {
dot_product <- dot_product + x[i] * y[i]
}
print(dot_product)
向量化,可以理解為對號入座,亮點就是sum()
和*
:
x <- c(1, 2, 3, 4, 5)
y <- c(5, 4, 3, 2, 1)
dot_product <- sum(x * y)
print(dot_product)
3.2 合并循環(huán)
假設(shè)對兩個矩陣A和B中的每個元素進(jìn)行遍歷,將它們相加,并將結(jié)果保存到矩陣C中??梢允褂脙蓚€嵌套的for循環(huán)實現(xiàn):
A <- matrix(1:9, 3, 3)
B <- matrix(10:18, 3, 3)
C <- matrix(0, 3, 3)
for (i in 1:nrow(A)) {
for (j in 1:ncol(A)) {
C[i, j] <- A[i, j] + B[i, j]
}
}
print(C)
#輸出結(jié)果:
[,1] [,2] [,3]
[1,] 11 13 15
[2,] 17 19 21
[3,] 23 25 27
但是理解這類的目的,合并循環(huán)的思路在這里剛好就是矩陣一一對應(yīng)的數(shù)字相加:
A <- matrix(1:9, 3, 3)
B <- matrix(10:18, 3, 3)
C <- A + B
print(C)
3.3 apply函數(shù)
假設(shè)有一個3x3的二維矩陣mat,需要將矩陣中每個元素求平方。我們可以使用for循環(huán)來實現(xiàn):
mat <- matrix(1:9, 3, 3)
result <- matrix(0, 3, 3)
for (i in 1:nrow(mat)) {
for (j in 1:ncol(mat)) {
result[i, j] <- mat[i, j] ^ 2
}
}
print(result)
用apply
+function
:
mat <- matrix(1:9, 3, 3)
result <- apply(mat, c(1, 2), function(x) x^2)
print(result)
3.4 矩陣運算
假設(shè)需要計算一個矩陣A的逆矩陣,使用for循環(huán)和矩陣運算實現(xiàn):
A <- matrix(c(1, 2, 3, 4), 2, 2)
det_A <- A[1, 1] * A[2, 2] - A[1, 2] * A[2, 1]
adj_A <- matrix(c(A[2, 2], -A[1, 2], -A[2, 1], A[1, 1]), 2, 2)
A_inv <- adj_A / det_A
print(A_inv)
#輸出結(jié)果:
[,1] [,2]
[1,] -2.0 1.0
[2,] 1.5 -0.5
若要優(yōu)化這一步驟,很簡單,直接用solve()
:
A <- matrix(c(1, 2, 3, 4), 2, 2)
A_inv <- solve(A)
print(A_inv)
3.5 foreach分解任務(wù)
用foreach
包實現(xiàn)多線程for循環(huán)
library(foreach)
library(doParallel)
# 創(chuàng)建一個1000行,1000列的矩陣
m <- matrix(runif(1000000), nrow = 1000)
# 初始化并行計算環(huán)境
cl <- makeCluster(detectCores())
registerDoParallel(cl)
# 使用foreach包和%dopar%運算符進(jìn)行并行計算
result <- foreach(i = 1:nrow(m), .combine = "+") %dopar% sum(m[i, ])
# 結(jié)束并行計算環(huán)境
stopCluster(cl)
# 輸出結(jié)果
print(result)
有人會說,這不就是用了個函數(shù)嗎?
是,但又不完全是,不然為何有人懂得用這個函數(shù),但有人需要一步一步算(并非說一步一步算不好,只有自己算過,理解了,才懂得去挖掘深度,化繁為簡)文章來源:http://www.zghlxwxcb.cn/news/detail-459374.html
4 討論
如果只知道個函數(shù)是知其然而不知其所以然,但是只知道計算過程便如優(yōu)化前的一樣,一步一步計算。得益于現(xiàn)在互聯(lián)網(wǎng)發(fā)展的飛起,各種便利工具各種開源方法,幾乎人人都是調(diào)包俠
,但是當(dāng)現(xiàn)成的輔佐無法滿足時還是需要回歸底層。最近深有感觸,不論是數(shù)據(jù)挖掘、還是機(jī)器學(xué)習(xí)深度學(xué)習(xí)、人工智能、全棧,分析的盡頭就是算法。文章來源地址http://www.zghlxwxcb.cn/news/detail-459374.html
到了這里,關(guān)于R語言:鑒于計算10億以內(nèi)訓(xùn)練模型記錄for循環(huán)的加速的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!