【问题标题】:How to speed up API calls in for Loop如何加快 for Loop 中的 API 调用
【发布时间】:2019-03-05 13:19:59
【问题描述】:

我最近编写了一个脚本,以便通过 API 调用查找搜索量。

这是我使用的脚本:

install.packages("SEMrushR")
library(SEMrushR)

#Data frame to append data

final_result_useo_rumbo <- data.frame()
mes_keywords_to_check <- readLines("useo_rumbo_es.txt") 
mes_keywords_to_check <- as.character(mes_keywords_to_check)

#Loop in order to look for each keyword that is in my list, then return Search volume thanks to the API call and finally store it in a new database.

for (i in 1:length(mes_keywords_to_check)) {
  test_keyword <- as.character(mes_keywords_to_check[i])
    df_test_2 <- keyword_overview_all(test_keyword, "es","API KEY")  
  final_result_useo_rumbo <- rbind(final_result_useo_rumbo,df_test_2)
}

脚本运行良好,但问题是我有很多关键字要检查 (800 000)。 当我为 60 000 个关键字做这件事时,花了将近 4 个小时才完成......

你知道我可以如何加快这个过程吗?有没有更好的方法来编写脚本?

【问题讨论】:

  • 我们可以重写您的脚本以使用更优化的 R 代码,但我怀疑这是否需要 4 小时缩短到几分钟。
  • 您可以进行的一项更改是避免在for 循环中使用rbind。它会导致二次复制。
  • @TimBiegeleisen 删除迭代 rbind 可以很容易地将它从几小时缩短到几分钟,我敢打赌
  • @HongOoi 然后将其发布为答案。
  • @HongOoi 应该用什么来代替 rbind?

标签: r api for-loop


【解决方案1】:

您可以尝试用apply 函数替换for 循环:

result <- sapply(mes_keywords_to_check, function(x) {
    keyword_overview_all(x, "es", "API KEY")
})

那么,你可以data.frame上面的,如果你想要一个数据框而不是一个矩阵:

result <- data.frame(result)

或者可以转置:

result <- data.frame(t(result))

您不需要对mes_keywords_to_check 中的每个条目调用as.character,因为您已经在循环之前将整个向量转换为字符(或apply 调用,在上述情况下)。此外,您可能也不需要在循环的每次迭代中调用rbind。相反,让 R 为您汇总数据,然后担心循环/应用完成后要做什么。

【讨论】:

  • 我将尝试使用apply 而不是for。关于从循环/应用中删除rbind,您的意思是我应该在循环/应用之后添加它吗?如果我这样做,那么我的循环每次都会覆盖结果。对吗?
  • AFAIK R 应该在对apply 的调用中自动为您执行“绑定”。不过,您可能需要在完成后进行一些按摩。
  • 好的,我尝试使用apply 函数,它看起来更快,但在我的最终数据库中,我确实有我所有的关键字,但我的数据框中总是有相同的结果.. .
  • @Franck 那么我的猜测是你没有使用我的确切代码。您需要将对 apply 的调用分配给实际变量。听起来你正在运行 apply 没有分配。
  • Bielgeisen :这里有一些新闻。我测试了sapply 函数,它正在工作。我还尝试了lapply,这似乎更快(不知道为什么)。但这还不够快。我可能会尝试parLapply 函数。无论如何,谢谢,这真的很有用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多