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