Perl和Python遍历文件小例子性能比较

一般来说,perl比python性能要好,不过这句话只针对同等水平的程序而言,像我等新手而言,再怎么写也是脚本语言,今天就随手在cygwin里写两个小例子,看看他们的执行速率

要求就分别读一个文件,每读一行,为了表示公平,变量就加1,最后将变量的最终值打印出来结束,当然仅属参考,因为可能会有更好更快的方法

随手下载一个网页,$ wget www.lihuia.com
–2014-11-10 23:11:09–  http://www.lihuia.com/
正在解析主机 www.lihuia.com (www.lihuia.com)… XX.XX.XX.XX
正在连接 www.lihuia.com (www.lihuia.com)|XX.XX.XX.XX|:80… 已连接。
已发出 HTTP 请求,正在等待回应… 200 OK
长度:未指定 [text/html]
正在保存至: “index.html”

index.html              [  <=>                 ]  52.15K   253KB/s 用时 0.2s

2014-11-10 23:11:10 (253 KB/s) – “index.html” 已保存 [53403]

那么就以index.html作为要读取的文件:

(1)$ cat test.pl
#!/usr/bin/perl -w

$i = 0;
while(<>){
    ++$i;
}
print $i;

 

$ time ./test.pl index.html
456
real    0m0.035s
user    0m0.015s
sys     0m0.015s

(2)$ cat test.py
#!/usr/bin/env python

import sys

i = 0
input_file = sys.argv[1]
pf = open(input_file, ‘r’)
for line in pf:
    i += 1
pf.close()
print i

$ time ./test.py index.html
456

real    0m0.080s
user    0m0.000s
sys     0m0.046s

将perl的钻石输入符给换掉,保持和python一致

(3)$ cat test.pl
#!/usr/bin/perl -w

$input_file = $ARGV[0];
$i = 0;
open my($pf), ‘<‘, $input_file;
while(<$pf>){
    ++$i;
}
close($pf);
print $i;

$ time ./test1.pl index.html
456
real    0m0.035s
user    0m0.000s
sys     0m0.015s

 

文件不以参数穿进去

(4)$ cat test.pl
#!/usr/bin/perl -w

$input_file = ‘index.html’;
$i = 0;
open my($pf), ‘<‘, $input_file;
while(<$pf>){
    ++$i;
}
close($pf);
print $i;

$ time ./test1.pl
456
real    0m0.036s
user    0m0.000s
sys     0m0.030s

(5)$ cat test.py
#!/usr/bin/env python

import sys

i = 0
input_file = ‘index.html’
pf = open(input_file, ‘r’)
for line in pf:
    i += 1
pf.close()
print i

 

$ time ./test.py
456

real    0m0.080s
user    0m0.031s
sys     0m0.030s

 

通过这一个小例子,perl脚本两种实现方式基本在0.020s~0.040s-波动,python脚本基本在0.070~0.080+波动(由于这小例子执行速度本身就很快执行完毕,所以还算上一些客观影响,所以波动就会稍显明显),但是基本能大概能看出一些问题,perl执行效率相比python应该是要好一些

当然这仅仅是一个小例子,而且说不定还有一些操作我没考虑进去,或者执行时间放到程序里打印可能会更准确等等,对于一些他们特定的数据类型的对比,结果未必如此,仅供参考

发表回复