【问题标题】:Fast splitting string快速拆分字符串
【发布时间】:2019-04-30 19:34:02
【问题描述】:

我从这种类型的文件(超过 2700 个)中读取了一系列行:

A = '1; 23245675; -234567; 123456; ...; 0'

A 是一个以; 作为数据分隔符的字符串。

为了拆分字符串,我首先使用了strsplit 函数,但是执行起来太慢了。然后我像这样使用regexp:

regexp(A,';','split')

还有比regexp更快的函数吗?

【问题讨论】:

  • 我不明白,在你的例子中A 是一个字符串还是一个单元格数组?如果它是一个单元格数组,你拆分的字符串是什么? A 中的那些根本不包含;。顺便说一句,如果您的数据是结构化的,请考虑将readtable 或dlmread 作为以格式化方式读取数据的更快选项。见here。
  • A 是一个字符串。如果可能的话,我必须以更有效的方式拆分字符串。

标签: matlab performance time strsplit regexp-substr


【解决方案1】:

作为内置函数1,textscan 可能是最快的选择:

result = textscan(A{1},'%f','Delimiter',';');

这里有一个小基准来证明:

A = repmat('1; 23245675; -234567; 123456; 0',1,100000); % a long string
regexp_time = timeit(@ () regexp(A,';','split'))
strsplit_time = timeit(@ () strsplit(A,';'))
split_time = timeit(@ () split(A,';'))
textscan_time = timeit(@ () textscan(A,'%f','Delimiter',';'))

结果:

regexp_time =
      0.33054
strsplit_time =
      0.45939
split_time =
      0.24722
textscan_time =
     0.057712

textscan 最快,比下一种方法 (split) 快 ~4.3 倍。

无论要分割的字符串长度是多少,这是最快的选择(注意x轴的对数刻度):


1“内置函数是 MATLAB 可执行文件的一部分。MATLAB 不会在 MATLAB 语言中实现这些函数。虽然大多数内置函数都有一个与之关联的 .m 文件,此文件仅提供该功能的文档。” (来自文档)

【讨论】:

    【解决方案2】:

    我能想到的可能的拆分函数是regexp、strsplit和split。

    我比较了它们对于大字符串的性能。结果显示split 稍快,而strsplit 比regexp 慢约2 倍。

    我是这样比较它们的:

    首先,根据您的问题创建一个大字符串 A(大约 1600 万条数据)。

    A = '1; 23245675; -234567; 123456; 0';
    for ii=1:22
        A = strcat(A,A);
    end
    

    选项 1:regexp

    tic
    regexp(A,';','split');
    toc
    
    Elapsed time is 12.548295 seconds.
    

    选项 2:strsplit

    tic
    strsplit(A,';');
    toc
    
    Elapsed time is 23.347392 seconds.
    

    选项 3:split

    tic
    split(A,';');
    toc
    
    Elapsed time is 9.678433 seconds.
    

    所以split 可能会帮助你加快一点速度,但并不明显。

    【讨论】:

      猜你喜欢
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-03
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多