2018-02-14 10:41 GMT+03:00 Ni Va <nivaem...@gmail.com>: > Le mardi 13 février 2018 14:30:38 UTC+1, Luc Hermitte a écrit : >> Hello Nicholas, >> >> > After reading a file and getting 1 million lines' List, I need to >> > make similar substitutions over matched lines ~500 times with this >> > func: >> > >> > >> > fun! foo#set_new_val(ressource) abort "{{{ >> > >> > " position >> > let pos = foo#getpos_ress(a:ressource) >> > let pres = foo#geth_presence(a:ressource) >> > let s:xml[pos] = substitute(s:xml[pos],'false\|true',pres,"") <<< >> > HERE >> > >> > " Slave/Voie01 to Voie08 >> > for idx in [1,2,3,4,5,6,7,8] <<< HERE >> > let pos = foo#getpos_ress(a:ressource.'/bar0'.string(idx)) >> > let s:xml[pos] = substitute(s:xml[pos],'false\|true',pres,"") <<< >> > HERE >> > endfor >> > >> > endfu"}}} >> > >> > >> > 1/ Can I optimize this function ? >> >> So far my experiments on the subject taught me that we are best avoiding >> :for and :while constructs when performances matter. >> If you can use map() instead, do! >> >> HTH, >> >> -- >> Luc Hermitte > > Yess Luc ! > > I finally reached to the same conclusion. > > 1/ But mapping Dict or List, inside the substitute func is needed no ? > 2/ Other point, passing by register with emmbedded pattern is it faster ? > > let @a = '\w\+\(<\/PRES\)' > let @b = pres.'\1' > > call map(voies_no, 'substitute(s:xml[v:val],"\=@a","\=@b","")')
Using registers here makes no sense, you can just use variables. `\=` is not going to work like you typed here. For loop with preceding substitute from original function look like they can be rewritten into call map( \[a:ressource] + map(range(1, 8), 'a:ressource."/bar0".v:val'), \'extend( \ s:xml, { \ extend(l:, {"pos": foo#getpos_ress(v:val)}).pos \ : substitute(s:xml[pos],''\c\vfalse|true'',pres,"")})') Note that my main VimL optimization principle is “less commands is better”. “Avoid loops” is one of the special cases only: by “less commands” I mean not “less commands in code”, but “less commands to execute”. I used to write a `:while` loop which contained nothing, but conditional expression and all the work was done there (`extend(l:, {})`, list literals as a replacement for comma operator and no optimizer messing with sequence points rock (until you need to debug this mess)). Note that for this reason lambdas (with the current implementation) are a no-go: they create functions with `return` command. If you need optimization and you have a choice between lambda and some kind of `eval()` (e.g. map string literal) then use `eval()`. > > > Thanks you > > -- > -- > You received this message from the "vim_use" maillist. > Do not top-post! Type your reply below the text you are replying to. > For more information, visit http://www.vim.org/maillist.php > > --- > You received this message because you are subscribed to the Google Groups > "vim_use" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to vim_use+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. -- -- You received this message from the "vim_use" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_use" group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_use+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.