自 2013 年以来,Emacs 有了一个现代哈希表库:ht
. 它提供了一个功能丰富的 API,类似于dash
列表和树、s
字符串、f
文件。
在 Emacs 24 中安装第三方库真的很简单,阅读安装说明。ht
中没有内置的相等函数ht
,所以我们还是要自己写函数。我有两种方法可以测试 2 个哈希表是否相等:
(defun ht-equal-1 (t1 t2)
(equal (ht-items t1) (ht-items t2)))
(defun ht-equal-2 (t1 t2)
(and (= (ht-size t1)
(ht-size t2))
(ht-map (lambda (k v) (equal (ht-get t1 k) v))
t2)))
对于小型哈希表,它们都应该很快,但我们不确定哪个对于较大的哈希表更快,所以让我们使用以下方法创建一个相对较大的哈希表ht<-plist
:
(setq foo-table-1 (ht<-plist (number-sequence 1 10000) 'equal))
(setq foo-table-2 (ht<-plist (number-sequence 1 10000) 'equal))
有一个很棒的 Elisp 函数benchmark-run
可以多次运行一个函数或一个 Elisp 表达式,然后报告它所用的时间。让我们运行 2 个函数,每个函数比较我们刚刚创建的 2 个哈希表:
(benchmark-run 1000 (ht-equal-1 foo-table-1 foo-table-2))
;; => (5.36585361 4 0.6110091979999996)
(benchmark-run 1000 (ht-equal-2 foo-table-1 foo-table-2))
;; => (3.708278817 0 0.0)
它似乎ht-equal-2
运行得更快,所以你应该使用它。