快速拆分字符串

时间:2018-11-28 19:55:42

标签: matlab performance time strsplit regexp-substr

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

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

A是一个以;作为数据定界符的字符串。

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

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

功能比regexp还要快吗?

2 个答案:

答案 0 :(得分: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轴的对数刻度):

benchmark of string splitting


1 ”内置函数是MATLAB可执行文件的一部分。MATLAB并未以MATLAB语言实现这些函数。尽管大多数内置函数都有与其相关联的.m文件,该文件仅提供该功能的文档。” (来自文档)

答案 1 :(得分:0)

我可以考虑的可能的拆分函数是regexpstrsplitsplit

我比较了它们在大弦上的表现。结果显示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可能会帮助您加快一点速度,但这并不明显。