r - 有没有办法显着加快 R 包 stringdist 的速度,例如使用 Rcpp?
问题描述
我有一个循环,我必须在其中计算一个字符串和许多字符串的向量之间的距离。我使用包“stringdist”和同名函数,效果很好。
但是,每次计算距离都需要相当长的时间。例如,要获得一个单词和 350 万个其他单词之间的距离大约需要 0.5 秒。这似乎并不多,但做 350 万次确实需要太长时间。
我不能做一个距离矩阵,因为这太大了,我将计算分开以避免必须计算一个完整的矩阵,即 350 万乘 350 万。
是否有可能使用 Rcpp 来计算 Levenshtein 和/或 Hamming 距离以加快速度(很多)?
我已经尝试过编译器包并使用“cmpfun”,但这不会改变速度。我假设我必须使用 C++ 编写函数 stringdist?不幸的是我不知道怎么做。
stringdist 是循环的一部分,它占用了该循环步骤 95% 以上的时间,因此减少会非常有帮助。
任何帮助,将不胜感激。
编辑1:
这是一个小的字符串向量,例如:
bioID
[1] "F" "FPhGLGcbLFF" "FhGWhSLYcmYF" "FhGcGbGYhF" "GGLcSFhGmhLYF" "GGbhhcLFF"
[7] "GLWGcGLmhcLFF" "GLYmcmFF" "GLbcmYF" "GLhhFGmGccmFF" "GLhhLGYLbGmFF" "GLhhLGbGchmYF"
[13] "GLhhLGmLYcmYF" "GLhhLLLGmcmFF" "GLhhLhGGGcmYF" "GLhhPPmmchmYF" "GLhhmGbGLcmYF" "GLhmYbGmmPmbF"
[19] "GLhmcbLFF" "GPhbhYmhPLbF" "GbhmLFF" "GhhYcmYF" "GmGhGYhcLFF" "GmbmbmhcLFF"
[25] "LGGYmcmFF" "LGLGmPmbF" "LGbF" "LGhbLchmYF" "LLGLYhGcLFF" "LLPGhhbPLmcmFF"
[31] "LLcmmPPmhcLFF" "LLhhLLGLhhYmcmFF" "LPPhcbLFF" "LYcmYF" "LbGmmPmbF" "LbLLGGccmYF"
[37] "LhPbGchmYF" "LhbGbmYGYhF" "LmhGLmLLhF" "PGYLhGcGYhF" "PLhhLLGLhhYmcmFF" "PLhhchhGhGLccmFF"
[43] "PLhmGLhhPmGGcmFF" "PbLhhbLmhGcLFF" "PbbcbGbcLGYhF" "PbhLcLGmhLYF" "PcLFF" "PcPcLFF"
[49] "PhbcLSmcmFF" "PmYcmYF" "PmbF" "SFFbmbhLYcmYF" "SGGGbhchmYF" "SGGPhLGcbLFF"
[55] "SGGmGcmhGcLFF" "SGLGcFGhcLFF" "SGLGmGLGcmYF" "SGLLGhGmhLYF" "SGLPbPmYmcmFF" "SGLWhGcGbLFF"
[61] "SGLmmLmhcLFF" "SGPLbbmmPmbF" "SGPmhLcbcchmYF" "SGSGGbLhchmYF" "SGWGYLGcmYF" "SGWhLbPLbcmYF"
[67] "SGbGGmhLYF" "SGcbLFGmmPmbF" "SGcmWGGGLLbF" "SGhLLGGLmcmYF" "SGhbhGPcYcmYF" "SGmGGLLFLYmcmFF"
[73] "SGmLGLLmPmbF" "SLFGGhGbbLcLFF" "SLFGbGFhcLFF" "SLFGmGGhGLmLLhF" "SLFPFbcLLLYcmYF" "SLFPLLGGhchmYF"
[79] "SLFSFbcLFF" "SLFbGhcmYGYhF" "SLFbGmLYGYhF" "SLFcGGLccbLFF" "SLFhGLLmhcLFF" "SLFmGLbcmGmcmFF"
[85] "SLFmPchmYcmYF" "SLFmbPLGLmLLhF" "SLGGGLLFYmcmFF" "SLGGGLLGmhcLFF" "SLGGGLmcbLFF" "SLGGGYmcmFF"
[91] "SLGGGhGLmLLhF" "SLGGGhLcYmcmFF" "SLGGGhhcLFF" "SLGGLGYhmcmFF" "SLGGLLGcYmcmFF" "SLGGLLhGcLFF"
[97] "SLGGLhFhcLFF" "SLGGSGLhGhhYmcmFF" "SLGGbLYcmYF" "SLGGbbcLYGYhF"
编辑 2:我使用@Andrew 的评论重新思考问题,这就是我现在的处理方式:
因为我现在只需要 1 的距离,所以我只使用长度相同、短一个字母或长一个字母的字符串来计算我手头的字符串的距离。这大大减少了时间。大型数据集仍然需要很长时间,但它已经有所帮助。
解决方案
推荐阅读
- java - 无法为 com.r3.corda.finance.obligation.flows.CreateObligation$Initiator 类型的 FlowLogic 构造 FlowLogicRef
- java - vscode 类路径无法正确导入我的 eclipse user_library
- python - trie 结构的工作原理
- oracle - 无法在 Oracle 中使用传统备份导入
- angularjs - 多个div标签上的angualrjs指令
- java - 如何实现两个线程列表之间的互斥,而不是列表中的线程?
- shopify - Shopify - 日期现在不会在页面刷新时更新
- java - 对 Arraylist 对象进行排序
- android - 如何在 Google Map Distance Matrix API 中获取坐标而不是起点和终点地址
- git - 为什么“git status”显示我在主分支上,而“git 分支”不在新创建的存储库中?