终于想起账号-_-!!

vim中perl与python解决文本的性能比拟

又是一天不务正业, 本想把手上的小我的项目推进一步的,
后果却迷失在了

如何给vim 加上XXX HACK NOTE等标签高亮显示上
为了hack todo-vim 插件(大小字查找问题), 又花了大量工夫在vimscript+内置perl 交互上

在[2.]这步, 查到一篇也是很有帮忙的一篇 用vim解决巨量数据的文章. 其中有python也有perl也有vimscript,
通过他的实际, python比perl(在vIM里)解决文本快得多.
作为python / perl 双修修士, 有点不服气, 认为不可能有3倍差距.
因而,也花了工夫重做了一遍benchmark

详情

1. 生成测试用文件

perl -e 'open my $f,">","test.txt"; for($i=0;$i<100000;$++) { print $f "\"value\"\n{\n    \"wave\"\n    \"wave\"\n    \"wave\"\n    \"wave\"\n}\n\n";}'

文件 879992行, 6269943字节

2. 编写vim代码

内容如下

function! test#pythonmod1()    " 无正则 形式    let start_time = localtime()    echo("开始解决...")python3 << EOFimport vim, revimBuffer = vim.current.buffernum = 0c = 0l = 0while l < len(vimBuffer):    if vimBuffer[l] == '"value"':        num = 0    elif vimBuffer[l] == '    "wave"':        vimBuffer[l] = '        "wave' + str(num) + '"'        c += 1        num += 1    l += 1vim.command("let c=" + str(c))EOF"redraw!echo("实现!\n共替换 " . c ." 行\n耗时:" . (localtime()-start_time) . " 秒")endfunctionfunction! test#pythonmod()    " 正则版本    let start_time = localtime()    echo("开始解决...")python3 << EOFimport vim, revimBuffer = vim.current.buffernum = 0c = 0l = 0p_value = re.compile(".*value.*")p_wave = re.compile(".*wave.*")while l < len(vimBuffer):  if p_value.match(vimBuffer[l]):    num = 0  elif p_wave.match(vimBuffer[l]):    vimBuffer[l] = '        "wave' + str(num) + '"'    c += 1    num += 1  l += 1vim.command("let c=" + str(c))EOF"redraw!echo("实现!\n共替换 " . c ." 行\n耗时:" . (localtime()-start_time) . " 秒")endfunctionfunction! test#perlmod1()    " 无正则版本    let start_time = localtime()    echo("开始解决...")perl << EOF       $lnum = 1;    $num = 0;    $c = 0;    while ($lnum <= $curbuf->Count()) {        if ($curbuf->Get($lnum) eq '    "value"') {            $num = 0;        }        elsif ($curbuf->Get($lnum) =~ '    "wave"') {            $curbuf->Set($lnum, '        "wave' . $num . '"');            $c += 1;            $num += 1;        }        $lnum += 1    }    VIM::DoCommand("let c=" . $c);EOF"redraw!echo("实现!\n共替换 " . c ." 行\n耗时:" . (localtime()-start_time) . " 秒")endfunctionfunction! test#perlmod()    " 正则版本    let start_time = localtime()    echo("开始解决...")perl << EOF       $lnum = 1;    $num = 0;    $c = 0;    while ($lnum <= $curbuf->Count()) {        if ($curbuf->Get($lnum) =~ /value/) {            $num = 0;        }        elsif ($curbuf->Get($lnum) =~ /wave/) {            $curbuf->Set($lnum, '        "wave' . $num . '"');            $c += 1;            $num += 1;        }        $lnum += 1    }    VIM::DoCommand("let c=" . $c);EOF"redraw!echo("实现!\n共替换 " . c ." 行\n耗时:" . (localtime()-start_time) . " 秒")endfunction

因为无奈应用python2版本, vim只能运行python3
python版本

perl版本

机器配置及操作系统

操作系统为节电配置

python正则版本

首次运行

第二次

第三次

均匀工夫为7.334秒

python非正则版本

首次运行

第二次

第三次

均匀工夫为: 6.667秒

perl正则版本

首次运行

第二次

第三次

均匀工夫为6.667秒

perl非正则版本

首次运行

第二次

第三次

均匀工夫为 7.667秒

论断

能够看出非正则版本 python略快一些, 正则版本则是perl性能当先
所以, 在我这软硬件条件下, vim+perl/python 解决文本内容性能伯仲之间

ps:原作者贴出的代码里, perl版本是有调用vim redraw, 而python没有调用, 我猜是性能差距的次要起源.
PS2:perl文字处理应用正则性能好, 而python不应用正则性能高. 很有意思的