vim中perl与python处理文本的性能比较

终于想起账号-_-!!

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不使用正则性能高. 很有意思的

兴趣广泛,专注代码,长期工作在*nix上,python/perl/vim作为文本工具.

10 声望
2 粉丝
0 条评论
推荐阅读
为什么Python使用者远远大于perl
python是预编译然后从pypi上下载 python(pip)将package下载到本地 然后解压后将package内容安装到不同的指定目录

德熀阅读 444

又一款眼前一亮的Linux终端工具!
今天给大家介绍一款最近发现的功能十分强大,颜值非常高的一款终端工具。这个神器我是在其他公众号文章上看到的,但他们都没把它的强大之处介绍明白,所以我自己体验一波后,再向大家分享自己的体验。

良许6阅读 1.9k

FastAPI性能碾压Flask?
不止一次的听过,FastAPI性能碾压Flask,直追Golang,不过一直没有测试过,今天闲着没事测试一下看看结果。不知道是哪里出了问题,结果大跌眼镜。

二毛erma02阅读 10.3k评论 3

封面图
Linux终端居然也可以做文件浏览器?
大家好,我是良许。在抖音上做直播已经整整 5 个月了,我很自豪我一路坚持到了现在【笑脸】最近我在做直播的时候,也开始学习鱼皮大佬,直播写代码。当然我不懂 Java 后端,因此就写写自己擅长的 Shell 脚本。但...

良许1阅读 2.1k

Python之如何优雅的重试
为了避免偶尔的网络连接失败,需要加上重试机制,那么最简单的形式就是在对应的代码片段加一个循环,循环体里使用异常捕获,连接成功时退出循环,否则就重复执行相关逻辑,此时修改之后的函数f如下

Harpsichord12073阅读 7.4k

基于 EKS Fargate 搭建微服务性能分析系统
近期 Amazon Fargate 在中国区正式落地,因 Fargate 使用 Serverless 架构,更加适合对性能要求不敏感的服务使用,Pyroscope 是一款基于 Golang 开发的应用程序性能分析工具,Pyroscope 的服务端为无状态服务且性...

亚马逊云开发者阅读 7.8k

ChatGPT的开源平替,终于来了!
最近这段时间,一个号称全球最大ChatGPT开源平替项目Open Assistant引起了大家的注意。这不最近还登上了GitHub的Trending热榜。[链接]根据官方的介绍,Open Assistant也是一个对话式的大型语言模型项目,可以理解...

CodeSheep2阅读 1.1k

封面图

兴趣广泛,专注代码,长期工作在*nix上,python/perl/vim作为文本工具.

10 声望
2 粉丝
宣传栏