终于想起账号-_-!!
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 << EOF
import vim, re
vimBuffer = vim.current.buffer
num = 0
c = 0
l = 0
while l < len(vimBuffer):
if vimBuffer[l] == '"value"':
num = 0
elif vimBuffer[l] == ' "wave"':
vimBuffer[l] = ' "wave' + str(num) + '"'
c += 1
num += 1
l += 1
vim.command("let c=" + str(c))
EOF
"redraw!
echo("完成!\n共替换 " . c ." 行\n耗时:" . (localtime()-start_time) . " 秒")
endfunction
function! test#pythonmod()
" 正则版本
let start_time = localtime()
echo("开始处理...")
python3 << EOF
import vim, re
vimBuffer = vim.current.buffer
num = 0
c = 0
l = 0
p_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 += 1
vim.command("let c=" + str(c))
EOF
"redraw!
echo("完成!\n共替换 " . c ." 行\n耗时:" . (localtime()-start_time) . " 秒")
endfunction
function! 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) . " 秒")
endfunction
function! 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不使用正则性能高. 很有意思的
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。