我需要一本字典,“只是为了键”,也就是说,这些值不太重要。 哪个值会消耗最少的内存? “0”“”,还有什么? 感谢。
答案 0 :(得分:6)
Tcl在封面下共享常量,因此只要它是文字就可以使用几乎任何东西。但是空字符串几乎肯定会在你的脚本中成为预定义的常量(即使你没有注意到它)并且非常短。或者使用单字符的字母数字字符串,这将生成一个较短的字符串形式的字典(否则几乎没有区别)。当然,0
是单字符的字母数字字符串。
在我自己的代码中,我主要使用"dummy value"
之类的值作为值。在大多数情况下,成本只是几个字节总,但对我来说它更清楚它并不意味着什么,所以如果我回到代码后来我不想弄清楚我在做什么...... {/ p>
答案 1 :(得分:1)
不是答案,但我认为更好地表达为一个而不是评论中的延续......
我在上面的评论中遵循了关于list和dict键搜索的比较效率的论点,我想我会做一些测试并展示结果。
我构建了一个包含一百万个键的字典,一个包含一百万个条目的数组和一个包含字典键的列表:
for {set i 0} {$i < 1000000} {incr i} {
set idx [expr rand()]
incr arr($idx)
dict incr dic $idx
}
set rands [dict keys $dic]
顺便说一句,除最终set rands...
外,这需要大约5.88秒。
然后,我定时在列表中使用lsearch
搜索不同的随机数,使用dict exists
搜索字典键,使用info exists arr()
搜索包含以下1000次迭代结果的数组:
lsearch $rands [expr rand()] 26349.115 microseconds per iteration
dict exists $dic [expr rand ()] 14.357 microseconds per iteration
info exists arr([expr rand()]) 14.652 microseconds per iteration
有趣。这并不奇怪,但我确实希望看到一些数字。
然后我重读了OP的最后一条评论,注意到对排序的引用,尝试对列表进行排序并使用lsearch -sorted
。对列表进行排序大约需要一秒钟。
lsearch -sorted $sortedRands [expr rand ()] 19.304 microseconds per iteration
当你告诉它列表已经排序时,lsearch
对排序列表的效果非常好。
但是,如果我省略-sorted
选项,则多更长
lsearch $sortedRands [expr rand()] 120206.369 microseconds per iteration
123604.209 microseconds per iteration
我对此感到非常惊讶,我做了两次。我也重复了info exists arr(...
并找到了与之前相同的结果,所以不仅仅是我的机器速度慢得多。
Doeas任何人都有任何想法为什么正常搜索排序列表是如此之慢?