有没有办法大大提高R包的stringdist速度,例如使用Rcpp吗?

时间:2019-06-12 13:25:03

标签: r rcpp stringdist

我有一个循环,其中我必须计算一个字符串和多个字符串的向量之间的距离。我使用包“ 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的距离,所以我只使用长度相同,较短一个字母或较长一个字母的字符串来计算手边的字符串的距离。这样可以大大减少时间。大型数据集仍然需要很长时间,但已经有所帮助。

0 个答案:

没有答案