Entirely agree with your VimL principle : less command is fast/better, inner system apis... Principle that works for any Language.
Out the fact that it is not here a xml treenode parser but inlines binary file modifications, do you think modifying large xml file (1Million line 40Mo) can be as fast as libxml (ox ruby, python) or xpath parser ? 2018-02-14 9:20 GMT+01:00 Nikolay Aleksandrovich Pavlov <zyx....@gmail.com>: > 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 a topic in the > Google Groups "vim_use" group. > To unsubscribe from this topic, visit https://groups.google.com/d/ > topic/vim_use/dY1x4ok__7w/unsubscribe. > To unsubscribe from this group and all its topics, 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.