gpt4 book ai didi

performance - 从 Perl 中的文本文件读入时跳过标题的最佳方法?

转载 作者:行者123 更新时间:2023-12-04 04:43:04 31 4
gpt4 key购买 nike

我正在从 Perl 中的制表符描述文件中抓取几列。该文件的第一行与其他行完全不同,因此我想尽可能快速有效地跳过该行。

这是我到目前为止。

my $firstLine = 1;

while (<INFILE>){
if($firstLine){
$firstLine = 0;
}
else{
my @columns = split (/\t+/);
print OUTFILE "$columns[0]\t\t$columns[1]\t$columns[2]\t$columns[3]\t$columns[11]\t$columns[12]\t$columns[15]\t$columns[20]\t$columns[21]\n";
}
}

有没有更好的方法来做到这一点,也许没有 $firstLine?或者有没有办法直接从第 2 行开始读取 INFILE?

提前致谢!

最佳答案

让我们得到一些关于这方面的数据。我对每个人的技术进行了基准测试...

#!/usr/bin/env perl

sub flag_in_loop {
my $file = shift;

open my $fh, $file;

my $first = 1;
while(<$fh>) {
if( $first ) {
$first = 0;
}
else {
my $line = $_;
}
}

return;
}

sub strip_before_loop {
my $file = shift;

open my $fh, $file;

my $header = <$fh>;
while(<$fh>) {
my $line = $_;
}

return;
}

sub line_number_in_loop {
my $file = shift;

open my $fh, $file;

while(<$fh>) {
next if $. < 2;

my $line = $_;
}

return;
}

sub inc_in_loop {
my $file = shift;

open my $fh, $file;

my $first;
while(<$fh>) {
$first++ or next;

my $line = $_;
}

return;
}

sub slurp_to_array {
my $file = shift;

open my $fh, $file;

my @array = <$fh>;
shift @array;

return;
}


my $Test_File = "/usr/share/dict/words";
print `wc $Test_File`;

use Benchmark;

timethese shift || -10, {
flag_in_loop => sub { flag_in_loop($Test_File); },
strip_before_loop => sub { strip_before_loop($Test_File); },
line_number_in_loop => sub { line_number_in_loop($Test_File); },
inc_in_loop => sub { inc_in_loop($Test_File); },
slurp_to_array => sub { slurp_to_array($Test_File); },
};

由于这是 I/O 可能会受到超出 Benchmark.pm 调整能力的力量的影响,我运行了几次并检查我得到了相同的结果。
/usr/share/dict/words是一个 2.4 meg 的文件,大约有 240k 行很短的行。由于我们不处理线条,因此线条长度无关紧要。

我只在每个例程中做了少量工作来强调技术之间的差异。我想做一些工作,以便通过更改读取文件的方式来确定您将获得或损失的性能的实际上限。

我在带有 SSD 的笔记本电脑上进行了此操作,但它仍然是笔记本电脑。随着 I/O 速度的增加,CPU 时间变得更加重要。在具有快速 I/O 的机器上,技术更为重要。

这是每个例程每秒读取文件的次数。
slurp_to_array:       4.5/s
line_number_in_loop: 13.0/s
inc_in_loop: 15.5/s
flag_in_loop: 15.8/s
strip_before_loop: 19.9/s

我震惊地发现 my @array = <$fh>最慢的幅度很大。鉴于所有工作都在 perl 解释器内部进行,我本以为它会是最快的。然而,它是唯一一个分配内存来保存所有行的,这可能是性能滞后的原因。

使用 $.又是一个惊喜。也许这是访问魔法全局的成本,或者可能是进行数字比较。

而且,正如算法分析所预测的那样,将头检查代码放在循环之外是最快的。但不是很多。如果您正在使用接下来的两个最快,可能还不够担心。

关于performance - 从 Perl 中的文本文件读入时跳过标题的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14393295/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com