Быстрое разделение строки

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

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

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

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

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

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


person Sara Savio    schedule 28.11.2018    source источник
comment
Я не понимаю, в вашем примере A это строка или массив ячеек? И если это массив ячеек, какие строки вы разделяете? Те, что в пределах A, вообще не содержат ;. Кстати, если ваши данные структурированы, рассмотрите readtable или dlmread как более быстрые варианты для чтения в отформатированном виде. См. здесь.   -  person EBH    schedule 29.11.2018
comment
А — строка. Мне нужно разделить строку более эффективным способом, если это возможно.   -  person Sara Savio    schedule 29.11.2018
comment
Вы рассматривали textscan? это намного быстрее, чем все упомянутые вами варианты   -  person EBH    schedule 29.11.2018


Ответы (2)


Будучи встроенной функцией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):

тест разбиения строк


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

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

person Banghua Zhao    schedule 29.11.2018