LuaMacro — Lua как язык макросов
Posted: Wed 29 Nov, 2017 11:34
Вот сравнение быстродействия mf.replace и unicode.utf8.gsub. На длинных строках + длина замены не равна длине образца mf.replace тормозит катастрофически. В данном примере - в 450 раз медленнее, чем unicode.utf8.gsub.
Впечатляет. Правда, в типичном для меня случае (в большом объёме текста найти и заменить один фрагмент порядка 1кб) разница не столь радикальна, всего в три раза, но задуматься заставляет.
for k=1,N do subj:gsub(patt:gsub("[%^%$%(%)%%%.%[%]%*%+%-%?]","%%%0"), repl) end
, чтобы избежать возможных регулярок. Но на скорость это влияет мало.наличие библиотеки
mf.*
, mf.rindex()/.replace()
для новичков это просто круто.правильно ли я понимаю что:
subj:gsub(patt:gsub("[%^%$%(%)%%%.%[%]%*%+%-%?]","%%%0"), repl)
mf.replace(subj, patt, repl)
О чём вы, какие профи.
Я не хочу догадываться что это такое страшное вы имели ввиду.
John Doe, это не он имел в виду, это - IgorZ! У меня, вроде, опыт работы с регэкспами не маленький. Но понять, что имел в виду IgorZ - мне терпения и зрения не хватило. По ощущениям - это круто!John Doe wrote: ↑Sat 07 Mar, 2020 17:10Я не хочу догадываться что это такое страшное вы имели ввиду.
Хотите обсудить - пожалуйста в viewtopic.php?f=57&t=7742
На самом деле, всё просто. Вbuniak_a_h wrote: ↑Sat 07 Mar, 2020 17:22John Doe, это не он имел в виду, это - IgorZ! У меня, вроде, опыт работы с регэкспами не маленький. Но понять, что имел в виду IgorZ - мне терпения и зрения не хватило. По ощущениям - это круто!John Doe wrote: ↑Sat 07 Mar, 2020 17:10Я не хочу догадываться что это такое страшное вы имели ввиду.
Хотите обсудить - пожалуйста в viewtopic.php?f=57&t=7742
subj
patt
заменяется на repl
. Но patt
, в общем случае, может быть любым, в том числе, содержать последовательности, интерпретируемые gsub
как шаблоны. Поэтому перед основной заменой делается предварительная: в patt
во всех местах, которые могут интерпретироваться как шаблоны, добавляется символ процента, экранирующий "шаблон". Просто, в самих шаблонах тоже добавлены символы процента, чтобы заменяемые символы интерпретировались как символы, а не как шаблоны. Конструкция проверена на корректность работы.repl
тоже, по идее, стоит подвергать аналогичной трансформации. Примерно так:Code: Select all
subj:gsub(patt:gsub("[%^%$%(%)%%%.%[%]%*%+%-%?]","%%%0"),:gsub("%%[0-9]","%%%0"))
repl
содержит шаблоны замены, результат корректен и идентичен mf.replace
, в отличие от предыдущего.Проверил. По скорости - примерно то же (в зависимости от строки и образца, то чуть быстрее, то чуть медленнее). Результат во всех проверенных случаях идентичен. Так что, полагаю, из-за большей читаемости такой вариант оптимальнее:
Code: Select all
subj:gsub((patt:gsub("%p","%%%0")),(repl:gsub("%%[0-9]","%%%0")))
patt
и repl
во избежание возможных проблем с возвратом второго результата.Code: Select all
local subj = ("abc"):rep(3e5)
local patt = "/a$b^c"
local repl = "de%0fgh"
Code: Select all
╔══════════════════════╗
║ 1│ 447 ║
║ 2│ 739 ║
║ 3│ 0.60487144790257 ║
╚════ 3 arguments ═════╝
"[%^%$%(%)%%%.%[%]%*%+%-%?]"
, второй результат - с "%p"
, третий - соотношение. Так что не всё так однозначно, хоть и не фатально.