快速拆分字符串
Fast splitting string
我从此类文件(超过 2700 个)中读取了一系列行:
A = '1; 23245675; -234567; 123456; ...; 0'
A
是以;
作为数据分隔符的字符串。
分割字符串我先用了strsplit
函数,但是执行起来太慢了。然后我像这样使用 regexp
:
regexp(A,';','split')
还有比regexp
更快的函数吗?
我能想到的拆分函数有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
可能会帮助你加快一点点,但不是很明显。
作为内置函数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"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."(来自文档)
我从此类文件(超过 2700 个)中读取了一系列行:
A = '1; 23245675; -234567; 123456; ...; 0'
A
是以;
作为数据分隔符的字符串。
分割字符串我先用了strsplit
函数,但是执行起来太慢了。然后我像这样使用 regexp
:
regexp(A,';','split')
还有比regexp
更快的函数吗?
我能想到的拆分函数有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
可能会帮助你加快一点点,但不是很明显。
作为内置函数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
).
无论要拆分的字符串的长度是多少,它都是最快的选项(注意 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."(来自文档)