Быстро расщепляющаяся строка - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть ряд строк, которые я читаю из файла (более 2700) этого типа:

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

A - это строка с ; в качестве разделителя для данных.

Чтобы разбить строку, я сначала использовал функцию strsplit, но она была слишком медленной для выполнения.Тогда я использовал regexp вот так:

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

Есть ли еще более быстрая функция, чем regexp?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Будучи встроенной функцией 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 - самый быстрый и в ~ 4,3 раза быстрее, чем следующий метод (split).

Это самый быстрый вариант независимо от длины строки, которую нужно разделить (обратите внимание на логарифмическую ось оси x):

benchmark of string splitting


1"Встроенная функция является частью исполняемого файла MATLAB. MATLAB не реализует эти функции на языке MATLAB. Хотя большинство встроенных функций имеет файл .m, связанный сдля них этот файл содержит только документацию для функции ".(из документации)

0 голосов
/ 29 ноября 2018

Возможные функции разделения: regexp, strsplit и split.

Я сравнил их производительность для большой строки.Результат показывает, что split немного быстрее, а strsplit примерно в 2 раза медленнее, чем regexp.

Вот как я их сравнил:

Сначала создайте большую строку A (около 16 миллионов данных) в соответствии с вашим вопросом.

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 может помочь вам немного ускориться, но это не очевидно.

...