R语言中字符串比较太慢

时间:2017-07-05 11:18:53

标签: r string loops comparison

R语言中的字符串比较太慢了。 它需要3分钟,太慢了;如果字符串更长,则需要更多时间。有没有办法快速比较字符串?谢谢!

    date()
    strArray1<-rep("1234567890",10000)
    strArray2<-rep("1234567890",10000)
    tt<-0
    for(xx in 1:10000)
    {
        for(yy in 1:10000)
        {
            if(strArray1[xx]==strArray2[yy])
            {
                tt<-tt+1
            }

        }

    }
    date()

更新 事实上,我有两个文件,比如a.txt和b.txt如下:

a.txt (>10000 lines):
abc00001
abc00035
abc15747
....

b.txt(&gt; 50000行):

abc00001 blablabla...
abc00002 blablabla...
abc00003 blablabla...
abc00004 blablabla...
....
abc60000  blablabla...

我想要做的是从b.txt中提取行。将提取包含a.txt的ID的行。这将比较数千个字符串并花费很长时间。

1 个答案:

答案 0 :(得分:1)

字符串比较本身并不是非常慢:

> v <- rep("1234567890",100)
> microbenchmark(v=="1234567890")
Unit: nanoseconds
              expr min  lq    mean median  uq   max neval
 v == "1234567890"   0 355 1006.05    355 709 39639   100

表达式v == "1234567890"需要100个字符串比较来评估。这样做的平均时间是1000纳秒,这意味着(在我的机器上)这种比较平均需要10纳秒。对于长度为10的字符串来说,这是相当快的。另一方面,R中的for循环非常慢。您需要找到一种方法来矢量化代码(它将在优化的C中运行隐式循环而不是解释为R)。

例如,以下向量化代码(与代码计算tt的相同值)在不到1秒的时间内运行:

print(date())
strArray1<-rep("1234567890",10000)
strArray2<-rep("1234567890",10000)
tt<-sum(sapply(strArray1,function(s){sum(strArray2 == s)}))
print(tt)
print(date())

毫无疑问,由于使用sapply的解决方案通常不是最理想的,因此可以更好地改进。