Perl多哈希表与单哈希表的区别

3
我希望读取和处理来自文件的输入集,然后将其打印出来。我需要使用三个键来存储数据。假设这三个键是k1,k2,k3
以下哪种方法会提供更好的性能?
$hash{k1}->{k2}->{k3} = $val;

或者
$hash{"k1,k2,k3"} = $val;

对于我之前的问题,我得到的答案是所有 Perl 哈希键都被视为字符串。


每个层级大约会有多少个键? - Chris Lutz
每个级别我将拥有至少100个键,因此总共有300个键。 - Raghuram
6
你过早地进行了优化。这段代码只需要在毫秒级别内运行。 - Chris Lutz
1
毫秒,如果不是微秒... - Dave Sherohman
我认为他在询问速度方面的问题。在我的建议中,Perl中的哈希表是树形结构,因此,如果您想要更快的速度,则需要更多的树层次。如果我说错了,请纠正我。(同时它也取决于键值对输入的概率理论,所以不可能所有的键看起来都像 {k1,k2,kn},其中n> = 3) - gaussblurinc
3个回答

5
除非你真的在处理大型数据集,否则使用产生更清晰代码的任何一种方法都可以。我可能错了,但这似乎是过早优化的表现。
如果不是这样的话,这可能取决于可能键的范围。如果顺序不是问题,按顺序排列数据,使k1成为最小的键集,k3成为最大的键。我怀疑这样可以在哈希值上使用更少的内存。根据您的数据集,甚至预设哈希大小也是明智的(我认为 %hash = 100 可以达到这个目的)。
至于哪一个更快,只有分析才能告诉。尝试两种方法并自己看看。
另外,请注意 $hash{k1}->{k2}-{k3} 是不必要的。 您可以编写 $hash{k1}{k2}{k3}。 在方括号中,无论是方形还是花括号,都不需要解除引用。

4
哈希查找速度与哈希中的项目数量无关,因此只进行一次哈希查找的版本将比进行三次哈希查找的版本更快地执行哈希查找部分操作。但是,另一方面,单次查找版本必须将三个键连接成一个字符串,然后才能将它们用作组合键;如果这个字符串是匿名的(例如,$hash{"$a,$b,$c"}),那么这可能涉及到一些有趣的事情,比如内存分配。总的来说,我认为连接操作应该足够快,以至于在大多数情况下,单次查找版本将比三次查找版本更快,但是知道哪个在你的情况下更快的唯一方法是编写相同的代码,并对比测试差异。

然而,就像其他人已经说过的那样,这是一种过早和毫无意义的微观优化。除非您知道自己存在性能问题(或者您具有显示问题正在发生并且即将在不久的将来出现的历史性能数据)并且您已经对代码进行了分析,以确定哈希查找是性能问题的原因,否则您正在浪费时间担心这个问题。哈希查找速度非常。虽然这几乎不是真正的基准,但:

$ time perl -e '$foo{bar} for 1 .. 1_000_000'
real    0m0.089s
user    0m0.088s
sys 0m0.000s

在这个微不足道(而且,无可否认,存在缺陷)的例子中,我得到了大约每秒1100万个哈希查找的速率。在你提问的时间内,你的计算机可以完成数亿甚至十亿次哈希查找。
以最易读和易于维护的方式编写哈希查找程序。如果你试图将其优化为尽可能快的速度,那么浪费的程序员时间将比任何处理时间更大!

2

如果您对内存有顾虑,我建议在开发的早期使用来自CPAN的Devel::Size来获取两种方案的大小。 否则,请选择对您来说更加友好的方案!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接