我从这个类型的文件(超过2700个)中读取了几行:
A = '1; 23245675; -234567; 123456; ...; 0'
A
是一个以;
作为数据定界符的字符串。
要分割字符串,我首先使用了strsplit
函数,但是执行起来太慢了。然后我像这样使用regexp
:
regexp(A,';','split')
功能比regexp
还要快吗?
答案 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轴的对数刻度):
1 ”内置函数是MATLAB可执行文件的一部分。MATLAB并未以MATLAB语言实现这些函数。尽管大多数内置函数都有与其相关联的.m文件,该文件仅提供该功能的文档。” (来自文档)
答案 1 :(得分:0)
我可以考虑的可能的拆分函数是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
可能会帮助您加快一点速度,但这并不明显。