亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么R中循環慢?

為什么R中循環慢?

慕田峪7331174 2019-07-13 10:42:23
我知道循環很慢R我應該試著用一種矢量化的方式去做事情。但是,為什么?為什么循環慢apply是快嗎?apply調用幾個子函數-看起來不太快。最新情況:很抱歉,這個問題是不恰當的。我把矢量化和apply..我的問題應該是,“為什么矢量化更快?”
查看完整描述

3 回答

?
絕地無雙

TA貢獻1946條經驗 獲得超4個贊

R中的循環是慢的,因為任何解釋的語言都是慢的:每一次操作都會帶來很多額外的負擔。

R_execClosure在……里面eval.c(這是調用用戶定義函數的函數)。它有近100行長,并執行各種操作-創建用于執行的環境,將參數分配到環境中,等等。

想一想,在C中調用函數(將args推到堆棧、跳轉、彈出args)時發生的事情要少得多。

這就是為什么你會得到這樣的時間安排(正如joran在評論中指出的那樣,這實際上不是apply這太快了,這是內部C循環mean太快了。apply只是普通的舊R碼):

A = matrix(as.numeric(1:100000))

使用循環:0.342秒:

system.time({
    Sum = 0
    for (i in seq_along(A)) {
        Sum = Sum + A[[i]]
    }
    Sum})

使用SUM:無法測量的?。?/trans>

sum(A)

這有點令人不安,因為,漸近地說,循環就像sum沒有任何實際的理由,它應該是緩慢的,它只是做更多的額外工作,每次迭代。

因此,請考慮:

# 0.370 secondssystem.time({
    I = 0
    while (I < 100000) {
        10
        I = I + 1
    }})# 0.743 seconds -- double the time just adding parenthesessystem.time({
    I = 0
    while (I < 100000) {
        ((((((((((10))))))))))
        I = I + 1
    }})

(這個例子是由拉德福德·尼爾)

因為(在R中是一個運算符,實際上每次使用它時都需要一個名稱查找:

> `(` = function(x) 2> (3)[1] 2

或者,一般來說,解釋操作(在任何語言中)都有更多的步驟。當然,這些步驟也提供了好處:你不能那,那個(在C.


查看完整回答
反對 回復 2019-07-13
?
慕絲7291255

TA貢獻1859條經驗 獲得超6個贊

循環不是總是慢的,而且apply是快速的。對此有一個很好的討論2008年5月,R新聞雜志:

尤伊·利格斯和約翰·福克斯。服務臺:我怎樣才能避免這個循環,或者讓它更快?r新聞,8(1):46-50,2008年5月。

在“循環!”(從第48頁開始),他們說:

許多關于R狀態的評論認為使用循環是一個特別糟糕的主意。這不一定是真的。在某些情況下,很難編寫向量化代碼,或者向量化代碼可能會消耗大量內存。

他們還建議:

  • 在循環之前將新對象初始化為完整長度,而不是在循環中增加它們的大小。
  • 不要在循環中做可以在循環之外完成的事情。
  • 不要為了避免循環而避免循環。

他們有一個簡單的例子,其中for循環需要1.3秒,但是apply內存耗盡了。


查看完整回答
反對 回復 2019-07-13
  • 3 回答
  • 0 關注
  • 1379 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號