快速拆分字符串

Fast splitting string

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

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

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

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

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

还有比regexp更快的函数吗?

我能想到的拆分函数有regexpstrsplitsplit

我比较了它们对于大字符串的性能。结果显示 split 稍快,而 strsplitregexp 慢 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可能会帮助你加快一点点,但不是很明显。

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

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"A built-in function is part of the MATLAB executable. MATLAB does not implement these functions in the MATLAB language. Although most built-in functions have a .m file associated with them, this file only supplies documentation for the function."(来自文档)