From: Oleh Krehel Date: Wed, 6 May 2015 13:21:23 +0000 (+0200) Subject: lisp/subr.el (delete-dups): Use a hash table X-Git-Tag: emacs-25.0.90~2180 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=1f052a5f26250d726618570a816ddb6fd0cc11a0;p=emacs.git lisp/subr.el (delete-dups): Use a hash table * lisp/subr.el (delete-dups): When there are more than 100 candidates, use a hash table. This can result in ~500 times speed-up for typical collections of size 5000, like that of `load-library'. --- diff --git a/lisp/subr.el b/lisp/subr.el index 0fec29c1404..591980d03fa 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -417,11 +417,19 @@ If N is omitted or nil, remove the last element." Store the result in LIST and return it. LIST must be a proper list. Of several `equal' occurrences of an element in LIST, the first one is kept." - (let ((tail list)) - (while tail - (setcdr tail (delete (car tail) (cdr tail))) - (setq tail (cdr tail)))) - list) + (if (> (length list) 100) + (let ((hash (make-hash-table :test #'equal)) + res) + (dolist (elt list) + (unless (gethash elt hash) + (puthash elt elt hash) + (push elt res))) + (nreverse res)) + (let ((tail list)) + (while tail + (setcdr tail (delete (car tail) (cdr tail))) + (setq tail (cdr tail)))) + list)) ;; See http://lists.gnu.org/archive/html/emacs-devel/2013-05/msg00204.html (defun delete-consecutive-dups (list &optional circular)