【发布时间】:2014-12-25 08:14:48
【问题描述】:
我有两个数组(Array1 和 Array2)。 Array1 包含大约 20,000 个非唯一元素。 Array2 包含大约 90,000 个唯一元素。我正在尝试计算 Array1 中也显示为 Array2 元素的元素数量。下面的 perl 脚本成功但缓慢地做到了这一点。是否有另一种计算 Array2 中存在的 Array1 元素数量的方法可能比这更快?
#!/usr/bin/perl
use strict;
use warnings;
use autodie;
# This program counts the total number of elements in one array that exist in a separate array.
my $Original_Array_File = "U:/Perl/MasterArray.txt";
# Read in the master file into an array.
open my $file, '<', $Original_Array_File or die $!;
my @Array2 = <$file>;
close $file;
my $path = "C:/Files by Year/1993";
chdir($path) or die "Cant chdir to $path $!";
for my $new_file ( grep -f, glob('*.txt') ) {
open my ($new_fh), '<', $new_file;
my @Array1 = <$new_file>;
my @matched_array_count ;
foreach @Array1 {
++$matched_array_count if ($_ ~~ @Array2 ) ;
}
【问题讨论】:
-
输入文件是什么样的 - 格式?行数?
-
您应该首先使用Devel::NYTProf module 分析您的脚本,以找出它在代码中花费最多时间的位置。
-
输入文件是 .txt 文件,大小在 200 KB 到 3 MB 之间。它们是叙述性讨论。我将它们分解成六个单词的序列。
-
嗨 Rick,自从您添加了 MCVE 以来,我已投票重新提出您的问题,现在很清楚您的问题是什么。通常的方法是将一个文件加载到散列中,然后循环通过第二个文件,使用
exists检查散列中是否有与当前行匹配的键。确保chomp两个文件中的每一行。另外,请注意,从 Perl 5.18.0 开始,The smartmatch family of features are now experimental,因此您不应使用~~。 -
如果我之前的评论不清楚,
~~是您的性能问题的原因。您正在进行@Array1 * @Array2比较,或者在您的情况下,总共大约 18 亿次。如果您使用我上面解释的方法,您将只进行@Array1哈希查找,或约 20,000 次,这会明显更快(假设哈希适合内存)。
标签: arrays performance perl element matching