Perl中“一维”散列优于数组的优点

时间:2010-12-01 11:05:58

标签: arrays perl hash performance grep

我只是想知道在一维数组上使用一维哈希(即只有键,没有值 - 我们不关心它们)的效率。

我想为此目的使用哈希的主要原因是我可以使用exists函数来查看“条目”是否已经存在。哈希也非常适合不重复密钥吗?对于数组,我需要设置我自己的涉及grep的检查,我认为这会更慢。

然后将对此哈希/数组进行迭代以进行某些操作。

我很想听到有关此事的任何见解,并提前感谢!

4 个答案:

答案 0 :(得分:7)

exists $hash{ $key } 

是一个很好的短表达,清晰易用。显然

!!grep { $_ eq $key } @array

不是很短,但是

$key ~~ @array # smart match

甚至更短。所以从5.10开始,它就像语法一样容易将智能匹配测试为exists

因此,根据数组和散列之间的性能差异进行猜测,我可以想象智能匹配对于一小部分项目执行速度会更快,但哈希到目前为止的性能优于数组查找大项目清单。

但是,无论如何,你应该Benchmark表现。


这就是原因。在Strawberry perl上,即使列表大小为1,哈希查找也优于字符串匹配:

array_lookup  577701/s           --         -46%
hash_lookup  1068376/s          85%           --

列表中有2个项目:

array_lookup  464684/s           --         -57%
hash_lookup  1068376/s         130%           --

有20个项目:

array_lookup  181554/s           --         -83%
hash_lookup  1068376/s         488%           --

我会使用哈希。

答案 1 :(得分:5)

是。如果要检查数组中是否存在项目,则必须遍历每个项目。在哈希表中,您只需查找密钥即可。这对于大数据集来说更快。

答案 2 :(得分:5)

在数学意义上,散列键是sets,数组是tuples。例如,元组('apple', 'banana')('banana', 'apple')是不同的实体,而集合{'apple', 'banana'}{'banana', 'apple'}是相同的。

当你需要元组和元组时,你应该使用集合。

如果您需要执行设置操作,您可能希望使用Set::Object,而不是每次都从头开始编写操作。

如果您要使用哈希键来表示集合,则将值设置为undef而不是1可以减少内存占用,如果您的集合很大,这可能会很重要。

答案 3 :(得分:4)

这绝对是Perl的标准技术。我自己的脚本充满了这样的代码:

my @elements = (...);
my %is_element = map { $_ => 1 } @elements;

Stack Overflow上有很多例子,例如: herehere

在哈希is approximately O(1)中查找密钥。