Some python-mode operations slow down noticeably when the region being edited contains an unclosed bracket or string: these constructs lead to python-mode scanning the entire remainder of the buffer, and this scan appears to take time O(nr_lines^2). When which-func mode is enabled, this slowness renders Emacs unusable, since we'll call python-info-current-defun frequently in order to update the modeline, and this function will take several seconds to complete. The following patch appears to remedy the problem without breaking anythig. === modified file 'lisp/progmodes/python.el' --- lisp/progmodes/python.el 2012-11-27 03:10:32 +0000 +++ lisp/progmodes/python.el 2012-12-14 11:28:58 +0000 @@ -1184,13 +1184,21 @@ (defun python-nav-end-of-statement () "Move to end of current statement." (interactive "^") - (while (and (goto-char (line-end-position)) - (not (eobp)) - (when (or - (python-info-line-ends-backslash-p) - (python-syntax-context 'string) - (python-syntax-context 'paren)) - (forward-line 1)))) + + (let (string-start bs-pos) + (while (and (goto-char (line-end-position)) + (not (eobp)) + (cond ((setq string-start (python-syntax-context 'string)) + (goto-char string-start) + (forward-sexp)) + ((python-syntax-context 'paren) + ;; The statement won't end before we've escaped + ;; at least one level of parenthesis. + (condition-case err + (goto-char (scan-lists (point) 1 -1)) + (scan-error (goto-char (nth 3 err))))) + ((setq bs-pos (python-info-line-ends-backslash-p)) + (goto-char bs-pos)))))) (point-marker)) (defun python-nav-backward-statement (&optional arg)