为什么这个perl脚本这么慢?

时间:2015-02-25 12:53:48

标签: performance perl

我编写了一个perl脚本,以便在polymake框架中实现。

该脚本完成以下任务。它的输入是来自$M的矩阵polymake。发布

print ref($M);

返回

Polymake::common::Matrix_A_Rational_I_NonSymmetric_Z

脚本的输出是一个矩阵,其行是从M获得的行,它取所有M行的所有子集的总和。例如,输入

1 0 0
1 3 0
1 0 3

返回

0 0 0
3 3 3
2 3 3
2 0 3
1 0 3
2 3 0
1 3 0
1 0 0

我的脚本代码是

use application 'polytope';
use Data::PowerSet 'powerset';

sub newVertices {
    my ($orig) = @_;
    my $n = $orig -> rows;
    my $vert = zero_vector($n);
    my $d = Data::PowerSet->new( {min => 1}, map {"$_"} (0..$n-1) );
    while (my $r = $d -> next) {
        my $v = new Vector($n);
        foreach (@$r) {
            $v += @$orig[$_];
        }
        $vert = $vert / $v;
    }
    return $vert;
}

脚本运行正常。我的问题是脚本的运行速度比我想象的要慢很多。我上面提到的例子大约需要半分钟才能运行。我的问题是

  1. 我是否认为对于行数相对较少的矩阵应该能够快速完成这样的任务?

  2. 为什么这个脚本这么慢?

  3. 有没有办法更有效地完成这项任务?

  4. 我怀疑问题可能是我正在处理它的矩阵对象类型,并且编写一个纯粹使用数组执行此操作的脚本可能更有效。我的问题是我无法弄清楚如何从一个数组转换回一个矩阵,所以我还没有试图在这些方面做一些事情。

0 个答案:

没有答案