Bha*_*rat 3 arrays perl hash performance grep
我只是想知道在一维数组上使用一维哈希(即只有键,没有值 - 我们不关心它们)的效率.
我想为此目的使用哈希的主要原因是我可以使用exists函数来查看"条目"是否已经存在.哈希也非常适合不重复密钥吗?对于数组,我需要设置我自己的涉及grep的检查,我认为这会更慢.
然后,对于某些操作,将遍历该散列/数组.
我很想听到有关这方面的任何见解,并提前感谢!
exists $hash{ $key } 
是一个很好的,简短的表达,清晰易用.明显
!!grep { $_ eq $key } @array
不是很短,但是
$key ~~ @array # smart match
甚至更短.所以从5.10开始,它在语法上很容易测试智能匹配exists.
因此,根据数组和散列之间的性能差异来猜测,我可以想象智能匹配对于一小部分项目执行速度会更快,但是散列将远远超过具有大量项目的数组查找.
但是,无论如何,您应该对性能进行基准测试.
这就是原因.在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%           --
我会使用哈希.
在数学意义上,散列键是集合,而数组是元组.例如,元组('apple', 'banana')和('banana', 'apple')是不同的实体,而套{'apple', 'banana'}和{'banana', 'apple'}是相同的.
当你需要元组和元组时,你应该使用集合.
如果需要执行set操作,可能需要使用Set :: Object,而不是每次都从头开始编写操作.
如果要使用哈希键来表示集合,则将值设置为undef而不是1可以减少内存占用,如果您的集合很大,则可能会很重要.
| 归档时间: | 
 | 
| 查看次数: | 4217 次 | 
| 最近记录: |