GNU bug report logs - #77620
thingatpt can be incredibly slow in python-mode buffers

Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.

Package: emacs; Reported by: JD Smith <jdtsmith@HIDDEN>; Done: Eli Zaretskii <eliz@HIDDEN>; Maintainer for emacs is bug-gnu-emacs@HIDDEN.

Message received at 77620-done <at> debbugs.gnu.org:


Received: (at 77620-done) by debbugs.gnu.org; 26 Apr 2025 11:23:12 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Apr 26 07:23:12 2025
Received: from localhost ([127.0.0.1]:58740 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1u8dcm-00013g-8r
	for submit <at> debbugs.gnu.org; Sat, 26 Apr 2025 07:23:12 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10]:56594)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <eliz@HIDDEN>) id 1u8dcj-00013R-4r
 for 77620-done <at> debbugs.gnu.org; Sat, 26 Apr 2025 07:23:10 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <eliz@HIDDEN>)
 id 1u8dcd-0006xo-Km; Sat, 26 Apr 2025 07:23:03 -0400
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org;
 s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date:
 mime-version; bh=sweMG9Om3/Q1FTqI/3zwDunjMpZPvctNVsG1g8x+b4g=; b=GCYhaUUjWN4B
 Be6dECnxXmYM69u5zFlEvH7jiqkbLrfHKXVS+C1x8hrDDckouC1T9DdI4QOF1fOaLSYuvuAa0w/U2
 LV2SotBk/AXwJPD/vQyIcMrrkxu/AOc4qqvxT/1z7FSuW9FNqFR7Bg3mUstEzqSr5wWCqVgeApPtO
 GTgy0WJtrLGeuUNFgYVMhI4H0804jc++HlP0sjExYTvKZgMk8j0xrVtmOgEi6wqFWnd4os+2sK0E3
 3AdCY3aaDyK9V/ysMkev7dgwbTZNDpxza9GKztEN1ZgeLRV/aRTVR2afMMJ1h67geqnWlGH4r/EaY
 wqgTy8WHzGmzQmPjXOHPRA==;
Date: Sat, 26 Apr 2025 14:22:59 +0300
Message-Id: <86ikmrupyk.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: kobarity <kobarity@HIDDEN>
In-Reply-To: <eke7zfg9wq5l.wl-kobarity@HIDDEN> (message from kobarity on
 Mon, 21 Apr 2025 23:22:14 +0900)
Subject: Re: bug#77620: thingatpt can be incredibly slow in python-mode buffers
References: <DD4BC1EE-246D-4080-9B93-07D359F8C70E@HIDDEN>
 <86cydnsz5v.fsf@HIDDEN> <eke7cydluz80.wl-kobarity@HIDDEN>
 <86semhqqml.fsf@HIDDEN>
 <eke74iyiyita.wl-kobarity@HIDDEN> <eke7zfg9wq5l.wl-kobarity@HIDDEN>
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 77620-done
Cc: 77620-done <at> debbugs.gnu.org, jdtsmith@HIDDEN
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> Date: Mon, 21 Apr 2025 23:22:14 +0900
> From: kobarity <kobarity@HIDDEN>
> Cc: 77620 <at> debbugs.gnu.org
> 
> kobarity wrote:
> > In the process of looking into #77620, I noticed bugs in the
> > end-of-block detection functions.  So I submitted a patch to #77941.
> > Please note that the patch attached to this mail assumes the #77941
> > patch.
> > 
> > In my environment, the next test shows about 2 seconds on _axes.py's
> > L8817.
> > 
> > > (/ (car (benchmark-run 10 (thing-at-point 'sexp))) 10)
> > 
> > But there are worse cases.  Let's add the next two lines to the end of
> > _axes.py with 4-character indent.
> > 
> >     a = 1
> >     b = 2
> > 
> > The same measurement at the end of line "a = 1" gives 6 seconds; at
> > the end of line "b = 2" it gives 7 seconds.  This is because it calls
> > time-consuming functions many times.
> > 
> > `python-nav-beginning-of-block' and `python-nav-end-of-block' are very
> > time consuming if the block is large.  In the case of _axes.py, "class
> > Axes" is a large block with over 8000 lines.
> > 
> > However, `python-nav-forward-sexp' that (thing-at-point 'sexp) calls
> > does not necessarily have to perform these functions.  They are just
> > called by `python-info-statement-ends-block-p': (Before #77941 patch)
> > 
> > (defun python-info-statement-ends-block-p ()
> >   "Return non-nil if point is at end of block."
> >   (let ((end-of-block-pos (save-excursion
> >                             (python-nav-end-of-block)))
> >         (end-of-statement-pos (save-excursion
> >                                 (python-nav-end-of-statement))))
> >     (and end-of-block-pos end-of-statement-pos
> >          (= end-of-block-pos end-of-statement-pos))))
> > 
> > The logic is that if the end of the current statement is the end of
> > the current block, then it is the last line of the block.  This is not
> > wrong, but the problem is that it takes time to move to the end of the
> > block.
> > 
> > Fortunately, in many cases it is much easier to determine that it is
> > not the end of the block.  Specifically, if the indentation of the
> > next statement is equal to or greater than the indentation of the
> > current statement, then the current statement cannot be the end of the
> > block.  The attached patch
> > 0001-Performance-optimization-of-python-info-statement-en.patch takes
> > advantage of this to improve the performance of
> > `python-info-statement-ends-block-p'.  Please remember that it assumes
> > the #77941 patch is applied.
> > 
> > 0001-Performance-optimization-of-python-info-statement-en.patch solves
> > the performance problem with _axes.py, but does not have much effect
> > on the problem with lines "a = 1" and "b = 2" added above.  The
> > attached patch
> > 0002-Add-cache-to-Python-block-navigation-functions.patch is an
> > attempt to introduce a cache to alleviate this problem.
> > 
> > I measured the following to disable the cache for each benchmark.
> > 
> > (/ (car (benchmark-run 10 (progn (thing-at-point 'sexp) (setq python-nav-cache nil)))) 10)
> > 
> > It shows about 1.6 seconds for both "a = 1" and "b = 2" lines.
> > 
> > I believe 0002-Add-cache-to-Python-block-navigation-functions.patch is
> > a PoC level patch, so I welcome opinions on what you think of this
> > direction.
> 
> I revised 0002-Add-cache-to-Python-block-navigation-functions.patch.
> There was no need to use a macro.

Thanks, installed, and closing the bug.




Notification sent to JD Smith <jdtsmith@HIDDEN>:
bug acknowledged by developer. Full text available.
Reply sent to Eli Zaretskii <eliz@HIDDEN>:
You have taken responsibility. Full text available.

Message received at 77620 <at> debbugs.gnu.org:


Received: (at 77620) by debbugs.gnu.org; 21 Apr 2025 14:22:27 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Mon Apr 21 10:22:27 2025
Received: from localhost ([127.0.0.1]:35883 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1u6s2U-00032q-Fx
	for submit <at> debbugs.gnu.org; Mon, 21 Apr 2025 10:22:26 -0400
Received: from mail-pl1-x634.google.com ([2607:f8b0:4864:20::634]:56386)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <kobarity@HIDDEN>)
 id 1u6s2R-00032P-91
 for 77620 <at> debbugs.gnu.org; Mon, 21 Apr 2025 10:22:23 -0400
Received: by mail-pl1-x634.google.com with SMTP id
 d9443c01a7336-225477548e1so38783375ad.0
 for <77620 <at> debbugs.gnu.org>; Mon, 21 Apr 2025 07:22:23 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1745245337; x=1745850137; darn=debbugs.gnu.org;
 h=mime-version:user-agent:references:in-reply-to:subject:cc:to:from
 :message-id:date:from:to:cc:subject:date:message-id:reply-to;
 bh=Ll1yhBNYXe03Gc7zQfO99lmpqnld8RPVUWkAcR4awAs=;
 b=FjtkJbq64lVkp62zJ06NYyh+piMVj1t28pvy4P5nrIaSTNJS7PObut1T0Gqmuw1Yl2
 Iyq5IRvy5hBN2z1CxB5b7xVPnBDAbTjrHOE8YOD7lLcZ1zoTyMYeJChYmshNbAsr0zc3
 e44ycMTJoeBbqp0fwrzkobPypTrbUclH/bj5qROK5Vt6OP4l1spQdqy0Aq9T+BgMZKio
 jts48a07CgE7GcyOWUI3TRJaVSxQRyz48oXbwaiY9Umv70o96i9uNRfLErPlpJN6BqGu
 MRDGq3ewLGct9E5IAiTvnca+XsiDIEfXsi3t0+P6/q63QlSTvSyRyQz/aVO5tOxmauKm
 wuPw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1745245337; x=1745850137;
 h=mime-version:user-agent:references:in-reply-to:subject:cc:to:from
 :message-id:date:x-gm-message-state:from:to:cc:subject:date
 :message-id:reply-to;
 bh=Ll1yhBNYXe03Gc7zQfO99lmpqnld8RPVUWkAcR4awAs=;
 b=bvNri58V9kzZAP75m+EkiPa093fGxt1EtF9Z/mCT/wqRwhhfpIjgJ1MebS/uhdM+ww
 rLk+wLuP5Nsgq7JqMqgn2QBIuK1v9j5oHwgm8FtxuDpP+tmN03Un/1i0C+DdpOdaJo11
 yujTxEMhh6ue+5boKXCi4+gvxv372HnZR73YroOIi322sGsvqSLClfPM2LfmBqEBbXiz
 iFINiLAlqmmCkBy3GkN0Clt9aTYH7xyoNJvyjUmFHdXT2MyrjV7tHwoR3G8Cof03ihyL
 aKO9U6zYAaTLXxtiP+fb33M1gbEDYqSDvLr0Oj+WeBO4Zaj9mdMLBspaKLhcuf4y+P0r
 D93Q==
X-Gm-Message-State: AOJu0YwNBJMWjzbGZLnAxlKSWwBcPc3Rlk3iPMlh6szl/JXz5yGAx0an
 gt8vijkhRNKnPbsu4FrEQwDAcO3bt8S0suE6/9r7tAdHyuGaMi6E
X-Gm-Gg: ASbGncv1DoT8AiKx3TxkoR74DtU5T8nYLCIYun+F7qWQmF0amKR9AMPisKvYSsiHOzc
 1IqJ7T0qu7kP4NAlt+UPle20pl00oQKxAnHZU1lrO+6vf3sidjuUc94DnUQGmXQ0ey5QRTNMAFH
 b0CRYtyd+n0WC1IfdULyZ8hmg+im7RHBJnAQZS6YC+Eviu3JRPhJCMobcStkE7B3bS2il2uUaN7
 zDOSYv/6n5Bf7h7yh9sGsLSIgZw7AAv5fTZ5I9hc7PjwqQuoVT0ehEPifMXWwV03VdzOiylEyRn
 IleIgC7dxvthA0iRuYGQVD6klKvV/M0dBYYyXXlpKn8jp09dnx72cWo0Msy0azosQo5hSyI=
X-Google-Smtp-Source: AGHT+IGODLCkxC5HRevFtbF/AiKuhbgwCQBx11+UQ1IPAyWFQBbQHyzQTrwRtx5TukuZ5lsYdzxAew==
X-Received: by 2002:a17:902:f708:b0:224:ab0:9b00 with SMTP id
 d9443c01a7336-22c535ac5d7mr181659005ad.27.1745245337136; 
 Mon, 21 Apr 2025 07:22:17 -0700 (PDT)
Received: from localhost (58x12x133x161.ap58.ftth.ucom.ne.jp. [58.12.133.161])
 by smtp.gmail.com with ESMTPSA id
 d9443c01a7336-22c50eb4aadsm65586325ad.146.2025.04.21.07.22.15
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Mon, 21 Apr 2025 07:22:16 -0700 (PDT)
Date: Mon, 21 Apr 2025 23:22:14 +0900
Message-ID: <eke7zfg9wq5l.wl-kobarity@HIDDEN>
From: kobarity <kobarity@HIDDEN>
To: Eli Zaretskii <eliz@HIDDEN>,
	jdtsmith@HIDDEN
Subject: Re: bug#77620: thingatpt can be incredibly slow in python-mode buffers
In-Reply-To: <eke74iyiyita.wl-kobarity@HIDDEN>
References: <DD4BC1EE-246D-4080-9B93-07D359F8C70E@HIDDEN>
 <86cydnsz5v.fsf@HIDDEN> <eke7cydluz80.wl-kobarity@HIDDEN>
 <86semhqqml.fsf@HIDDEN> <eke74iyiyita.wl-kobarity@HIDDEN>
User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue)
 FLIM-LB/1.14.9 (=?ISO-8859-4?Q?Goj=F2?=) APEL-LB/10.8 EasyPG/1.0.0
 Emacs/31.0.50 (x86_64-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO)
MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue")
Content-Type: multipart/mixed; boundary="Multipart_Mon_Apr_21_23:22:13_2025-1"
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 77620
Cc: 77620 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

--Multipart_Mon_Apr_21_23:22:13_2025-1
Content-Type: text/plain; charset=US-ASCII

kobarity wrote:
> In the process of looking into #77620, I noticed bugs in the
> end-of-block detection functions.  So I submitted a patch to #77941.
> Please note that the patch attached to this mail assumes the #77941
> patch.
> 
> In my environment, the next test shows about 2 seconds on _axes.py's
> L8817.
> 
> > (/ (car (benchmark-run 10 (thing-at-point 'sexp))) 10)
> 
> But there are worse cases.  Let's add the next two lines to the end of
> _axes.py with 4-character indent.
> 
>     a = 1
>     b = 2
> 
> The same measurement at the end of line "a = 1" gives 6 seconds; at
> the end of line "b = 2" it gives 7 seconds.  This is because it calls
> time-consuming functions many times.
> 
> `python-nav-beginning-of-block' and `python-nav-end-of-block' are very
> time consuming if the block is large.  In the case of _axes.py, "class
> Axes" is a large block with over 8000 lines.
> 
> However, `python-nav-forward-sexp' that (thing-at-point 'sexp) calls
> does not necessarily have to perform these functions.  They are just
> called by `python-info-statement-ends-block-p': (Before #77941 patch)
> 
> (defun python-info-statement-ends-block-p ()
>   "Return non-nil if point is at end of block."
>   (let ((end-of-block-pos (save-excursion
>                             (python-nav-end-of-block)))
>         (end-of-statement-pos (save-excursion
>                                 (python-nav-end-of-statement))))
>     (and end-of-block-pos end-of-statement-pos
>          (= end-of-block-pos end-of-statement-pos))))
> 
> The logic is that if the end of the current statement is the end of
> the current block, then it is the last line of the block.  This is not
> wrong, but the problem is that it takes time to move to the end of the
> block.
> 
> Fortunately, in many cases it is much easier to determine that it is
> not the end of the block.  Specifically, if the indentation of the
> next statement is equal to or greater than the indentation of the
> current statement, then the current statement cannot be the end of the
> block.  The attached patch
> 0001-Performance-optimization-of-python-info-statement-en.patch takes
> advantage of this to improve the performance of
> `python-info-statement-ends-block-p'.  Please remember that it assumes
> the #77941 patch is applied.
> 
> 0001-Performance-optimization-of-python-info-statement-en.patch solves
> the performance problem with _axes.py, but does not have much effect
> on the problem with lines "a = 1" and "b = 2" added above.  The
> attached patch
> 0002-Add-cache-to-Python-block-navigation-functions.patch is an
> attempt to introduce a cache to alleviate this problem.
> 
> I measured the following to disable the cache for each benchmark.
> 
> (/ (car (benchmark-run 10 (progn (thing-at-point 'sexp) (setq python-nav-cache nil)))) 10)
> 
> It shows about 1.6 seconds for both "a = 1" and "b = 2" lines.
> 
> I believe 0002-Add-cache-to-Python-block-navigation-functions.patch is
> a PoC level patch, so I welcome opinions on what you think of this
> direction.

I revised 0002-Add-cache-to-Python-block-navigation-functions.patch.
There was no need to use a macro.

--Multipart_Mon_Apr_21_23:22:13_2025-1
Content-Type: application/octet-stream; type=patch; name="0002-Add-cache-to-Python-block-navigation-functions.patch"
Content-Disposition: attachment; filename="0002-Add-cache-to-Python-block-navigation-functions.patch"
Content-Transfer-Encoding: 7bit

From c70af095f1a3cc669e2481c4c5e720f10b0eb83c Mon Sep 17 00:00:00 2001
From: kobarity <kobarity@HIDDEN>
Date: Mon, 21 Apr 2025 23:17:37 +0900
Subject: [PATCH 2/2] Add cache to Python block navigation functions

* lisp/progmodes/python.el (python-nav-cache),
(python-nav-cache-tick): New variables.
(python-nav-cache-get),
(python-nav-cache-set),
(python-nav-with-cache): New functions.
(python-nav-beginning-of-block),
(python-nav-end-of-block): New wrapper functions.
(python-nav--beginning-of-block): Renamed from
python-nav-beginning-of-block.
(python-nav--end-of-block): Renamed from
python-nav-end-of-block.  (Bug#77620)
---
 lisp/progmodes/python.el | 52 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)

diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index 81440cfcfc9..594681594b0 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -2386,9 +2386,54 @@ python-nav-forward-statement
     (python-nav-beginning-of-statement)
     (setq arg (1+ arg))))
 
+(defvar python-nav-cache nil
+  "Cache to hold the results of navigation functions.")
+
+(defvar python-nav-cache-tick 0
+  "`buffer-chars-modified-tick' when registering the navigation cache.")
+
+(defun python-nav-cache-get (kind)
+  "Get value from the navigation cache.
+If the current buffer is not modified, the navigation cache is searched
+using KIND and the current line number as a key."
+  (and (= (buffer-chars-modified-tick) python-nav-cache-tick)
+       (cdr (assoc (cons kind (line-number-at-pos nil t)) python-nav-cache))))
+
+(defun python-nav-cache-set (kind current target)
+  "Add a key-value pair to the navigation cache.
+Invalidate the navigation cache if the current buffer has been modified.
+Then add a key-value pair to the navigation cache.  The key consists of
+KIND and CURRENT line number, and the value is TARGET position."
+  (let ((tick (buffer-chars-modified-tick)))
+    (when (/= tick python-nav-cache-tick)
+      (setq-local python-nav-cache nil
+                  python-nav-cache-tick tick))
+    (push (cons (cons kind current) target) python-nav-cache)
+    target))
+
+(defun python-nav-with-cache (kind func)
+  "Cached version of the navigation FUNC.
+If a value is obtained from the navigation cache using KIND, it will
+navigate there and return the position.  Otherwise, use FUNC to navigate
+and cache the result."
+  (let ((target (python-nav-cache-get kind)))
+    (if target
+        (progn
+          (goto-char target)
+          (point-marker))
+      (let ((current (line-number-at-pos nil t)))
+        (python-nav-cache-set kind current (funcall func))))))
+
 (defun python-nav-beginning-of-block ()
   "Move to start of current block."
   (interactive "^")
+  (python-nav-with-cache
+   'beginning-of-block #'python-nav--beginning-of-block))
+
+(defun python-nav--beginning-of-block ()
+  "Move to start of current block.
+This is an internal implementation of `python-nav-beginning-of-block'
+without the navigation cache."
   (let ((starting-pos (point)))
     ;; Go to first line beginning a statement
     (while (and (not (bobp))
@@ -2413,6 +2458,13 @@ python-nav-beginning-of-block
 (defun python-nav-end-of-block ()
   "Move to end of current block."
   (interactive "^")
+  (python-nav-with-cache
+   'end-of-block #'python-nav--end-of-block))
+
+(defun python-nav--end-of-block ()
+  "Move to end of current block.
+This is an internal implementation of `python-nav-end-of-block' without
+the navigation cache."
   (when (python-nav-beginning-of-block)
     (let ((block-indentation (current-indentation)))
       (python-nav-end-of-statement)
-- 
2.43.0


--Multipart_Mon_Apr_21_23:22:13_2025-1--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#77620; Package emacs. Full text available.

Message received at 77620 <at> debbugs.gnu.org:


Received: (at 77620) by debbugs.gnu.org; 20 Apr 2025 15:05:55 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sun Apr 20 11:05:55 2025
Received: from localhost ([127.0.0.1]:50624 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1u6WEy-0005ek-2S
	for submit <at> debbugs.gnu.org; Sun, 20 Apr 2025 11:05:55 -0400
Received: from mail-pf1-x42f.google.com ([2607:f8b0:4864:20::42f]:61498)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <kobarity@HIDDEN>)
 id 1u6WEs-0005cn-TT
 for 77620 <at> debbugs.gnu.org; Sun, 20 Apr 2025 11:05:49 -0400
Received: by mail-pf1-x42f.google.com with SMTP id
 d2e1a72fcca58-736c3e7b390so2710627b3a.2
 for <77620 <at> debbugs.gnu.org>; Sun, 20 Apr 2025 08:05:46 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1745161541; x=1745766341; darn=debbugs.gnu.org;
 h=mime-version:user-agent:references:in-reply-to:subject:cc:to:from
 :message-id:date:from:to:cc:subject:date:message-id:reply-to;
 bh=AaPJBYnFdb1nS/oITxmkTVUETWDJz010ZxqmCBAPPsA=;
 b=cqCZZOwO9TBzOwboJ2/2WIZEwtga+sPVpL8Cah3MjfEfd4VUiHxRoZkKByNS3Eh6f8
 wmPlwtkKFtkd+t5hcTa0y+8WcNxMt9f6AEVq+aHR/1kTpJmnOJZMFJVtqFDlhtOPUskV
 PRclv/+8LNBKQ/J36OFuIXRXV7tNI4JMZmOjgRIHcbZ/HMzUrDU8RLtSWJrqJ4dnkpWL
 9wc2Ti3Uxj8OMY0yYNc1gh4V0yxoA4AdxcGVa9GO7KUrlXA9C531xucBmAug8CKrO3XL
 ZSVC0uQPlHFVja0N+Fopl6y3m0bSga0fzqF32hzFxBX57RS8cM5R6FtwA7ZwXHjlnr6O
 6PGw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1745161541; x=1745766341;
 h=mime-version:user-agent:references:in-reply-to:subject:cc:to:from
 :message-id:date:x-gm-message-state:from:to:cc:subject:date
 :message-id:reply-to;
 bh=AaPJBYnFdb1nS/oITxmkTVUETWDJz010ZxqmCBAPPsA=;
 b=khc9+7w9Iif4Kec4j4TODwe2qL3T+RFmiNlzs5994FcaOtVjsNIfbtM0jRhKVw6VCM
 T73ld+EDDwONlb4+FLAMCo+3zd20XtmAW/z/nd3ADoAcUkK8wIySv1G8mLUGcmSC6oN5
 oY8v/8f+XtPxmU/nc1EsvZNOh674J8WznjeDLg0OqXb5OxafI0in71TS3cxwFuHqKdLg
 2k/4WoGdAgjSUcVBf9/VCJIXkvcGHXfVuNebwfgVYg74K6as8wu3E3qkyjgrGKICdIHK
 OYJY38g4ktVoJXqDuZAq49oVIBswbH7b+hVnV4/wxGba9//5/vGfaf+bA5L4usFMQ4Ci
 iVfA==
X-Gm-Message-State: AOJu0Yz6jmDdAoogIAgd721xwNP5hxvBlPcCnUOzhZO2NAO3Bh1Na2bS
 8zhdKcot6Sj6I150wPKUNcEhZXLzDqVM/nqWwE0EZNF3XUZMFS+e
X-Gm-Gg: ASbGncsmRTgFtsHABwtHdfdPKiN4hwAE6jr6iO3gk2HxZ5+otAX+62urWRWLZms8G9Q
 72/9d+NNh6/iy65Mzrq+qzmR/cKNlbJPc4HU66o8m6Hep+rIC/Uu+NcRJzry6O4XjXdSIe8UBDe
 dw/lFQE8tiPP73V2hgmmGa4tOF2xBl42k+394MhbkpXMCdwpgwo5+OJi3NlGlY0mM7smAkSEnnQ
 Nw/vqA0+Hwpz3LQdaxKDaneToQo3Sqpnjy/YgpoZqgs787ELjjZSarXMEUo7CHBh/WhkKudrRMS
 bBvlXtwfBMj4dBWVb9DcmzWwXqy4XL5coPRth/YyCyaJUnCgGOlThrkP1AXVzifKCgBPOfY=
X-Google-Smtp-Source: AGHT+IFcZk9rSbb2FhSDTqsGahqvyC1IPrt+wn644CCnTfno43+E2HjOdCN9qCH7AwRS6qNrCQmrcA==
X-Received: by 2002:a05:6a00:3d02:b0:736:4e0a:7e82 with SMTP id
 d2e1a72fcca58-73dc1480119mr10343588b3a.10.1745161540610; 
 Sun, 20 Apr 2025 08:05:40 -0700 (PDT)
Received: from localhost (58x12x133x161.ap58.ftth.ucom.ne.jp. [58.12.133.161])
 by smtp.gmail.com with ESMTPSA id
 d2e1a72fcca58-73dbfa57508sm4993380b3a.104.2025.04.20.08.05.39
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Sun, 20 Apr 2025 08:05:40 -0700 (PDT)
Date: Mon, 21 Apr 2025 00:05:37 +0900
Message-ID: <eke74iyiyita.wl-kobarity@HIDDEN>
From: kobarity <kobarity@HIDDEN>
To: Eli Zaretskii <eliz@HIDDEN>, jdtsmith@HIDDEN
Subject: Re: bug#77620: thingatpt can be incredibly slow in python-mode buffers
In-Reply-To: <86semhqqml.fsf@HIDDEN>
References: <DD4BC1EE-246D-4080-9B93-07D359F8C70E@HIDDEN>
 <86cydnsz5v.fsf@HIDDEN> <eke7cydluz80.wl-kobarity@HIDDEN>
 <86semhqqml.fsf@HIDDEN>
User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue)
 FLIM-LB/1.14.9 (=?ISO-8859-4?Q?Goj=F2?=) APEL-LB/10.8 EasyPG/1.0.0
 Emacs/31.0.50 (x86_64-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO)
MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue")
Content-Type: multipart/mixed; boundary="Multipart_Mon_Apr_21_00:05:36_2025-1"
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 77620
Cc: 77620 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

--Multipart_Mon_Apr_21_00:05:36_2025-1
Content-Type: text/plain; charset=US-ASCII

Eli Zaretskii wrote:
> 
> > Date: Thu, 10 Apr 2025 00:33:03 +0900
> > From: kobarity <kobarity@HIDDEN>
> > Cc: JD Smith <jdtsmith@HIDDEN>,
> > 	77620 <at> debbugs.gnu.org
> > 
> > Eli Zaretskii wrote:
> > > 
> > > > In #77588 this was shown to lead to long intermittent pauses with eglot in large python buffers, but the issue is more general for any packages using thingatpt in python buffers.
> > > 
> > > The Lisp profile, which seems to point to the likely culprit, is
> > > below.
> > > 
> > > Maybe kobarity (CC'ed) will have some ideas or suggestions.
> > > 
> > >          345  89% - ...
> > >          343  89%  - cond
> > >          343  89%   - let
> > >          343  89%    - condition-case
> > >          343  89%     - progn
> > >          343  89%      - save-excursion
> > >          173  44%       - funcall
> > >          173  44%        - thing-at-point--end-of-sexp
> > >          173  44%         - let
> > >          173  44%          - if
> > >          173  44%           - condition-case
> > >          173  44%            - forward-sexp
> > >          173  44%             - python-nav-forward-sexp
> > >          173  44%              - python-nav--forward-sexp
> > >          173  44%               - python-info-statement-ends-block-p
> > >          173  44%                - python-nav-end-of-block
> > >           96  24%                 - python-nav-end-of-statement
> > >           69  17%                  - syntax-ppss
> > >           67  17%                     parse-partial-sexp
> > >           27   7%                  - python-info-line-ends-backslash-p
> > >           27   7%                   - syntax-ppss
> > >           27   7%                      parse-partial-sexp
> > >           76  19%                 - python-nav-beginning-of-block
> > >           76  19%                  - python-nav-backward-block
> > >           76  19%                   - python-nav-forward-block
> > >           75  19%                    - python-syntax-context-type
> > >           75  19%                     - syntax-ppss
> > >           74  19%                        parse-partial-sexp
> > >            1   0%                    - python-nav-beginning-of-statement
> > >            1   0%                       point-marker
> > >            1   0%                   current-indentation
> > >          170  44%       - let
> > >          170  44%        - if
> > >          170  44%         - funcall
> > >          170  44%          - thing-at-point--beginning-of-sexp
> > >          170  44%           - let
> > >          170  44%            - if
> > >          170  44%             - forward-sexp
> > >          170  44%              - python-nav-forward-sexp
> > >          170  44%               - python-nav--forward-sexp
> > >          170  44%                - python-info-statement-ends-block-p
> > >          170  44%                 - python-nav-end-of-block
> > >           95  24%                  - python-nav-end-of-statement
> > >           63  16%                   - syntax-ppss
> > >           62  16%                      parse-partial-sexp
> > >           31   8%                   - python-info-line-ends-backslash-p
> > >           31   8%                    - syntax-ppss
> > >           30   7%                       parse-partial-sexp
> > >            1   0%                     re-search-forward
> > >           75  19%                  - python-nav-beginning-of-block
> > >           75  19%                   - python-nav-backward-block
> > >           75  19%                    - python-nav-forward-block
> > >           72  18%                     - python-syntax-context-type
> > >           72  18%                      - syntax-ppss
> > >           71  18%                         parse-partial-sexp
> > >            2   0%                       re-search-backward
> > >            1   0%                     - python-nav-beginning-of-statement
> > >            1   0%                      - python-info-line-ends-backslash-p
> > >            1   0%                       - syntax-ppss
> > >            1   0%                          syntax-ppss--data
> > >            2   0%  - python-shell-get-process
> > >            2   0%   - python-shell-get-buffer
> > >            2   0%    - seq-some
> > >            2   0%     + seq-do
> > >           32   8%   Automatic GC
> > >            6   1% - command-execute
> > >            6   1%  - call-interactively
> > >            6   1%   - byte-code
> > >            6   1%    - read-extended-command
> > >            6   1%     - read-extended-command-1
> > >            6   1%      - completing-read
> > >            6   1%       - completing-read-default
> > >            6   1%        - read-from-minibuffer
> > >            1   0%           redisplay_internal (C function)
> > >            2   0%   redisplay_internal (C function)
> > 
> > Please give me some time as I'm trying to improve performance.
> 
> Sure, there's no rush.  TIA.

In the process of looking into #77620, I noticed bugs in the
end-of-block detection functions.  So I submitted a patch to #77941.
Please note that the patch attached to this mail assumes the #77941
patch.

In my environment, the next test shows about 2 seconds on _axes.py's
L8817.

> (/ (car (benchmark-run 10 (thing-at-point 'sexp))) 10)

But there are worse cases.  Let's add the next two lines to the end of
_axes.py with 4-character indent.

    a = 1
    b = 2

The same measurement at the end of line "a = 1" gives 6 seconds; at
the end of line "b = 2" it gives 7 seconds.  This is because it calls
time-consuming functions many times.

`python-nav-beginning-of-block' and `python-nav-end-of-block' are very
time consuming if the block is large.  In the case of _axes.py, "class
Axes" is a large block with over 8000 lines.

However, `python-nav-forward-sexp' that (thing-at-point 'sexp) calls
does not necessarily have to perform these functions.  They are just
called by `python-info-statement-ends-block-p': (Before #77941 patch)

(defun python-info-statement-ends-block-p ()
  "Return non-nil if point is at end of block."
  (let ((end-of-block-pos (save-excursion
                            (python-nav-end-of-block)))
        (end-of-statement-pos (save-excursion
                                (python-nav-end-of-statement))))
    (and end-of-block-pos end-of-statement-pos
         (= end-of-block-pos end-of-statement-pos))))

The logic is that if the end of the current statement is the end of
the current block, then it is the last line of the block.  This is not
wrong, but the problem is that it takes time to move to the end of the
block.

Fortunately, in many cases it is much easier to determine that it is
not the end of the block.  Specifically, if the indentation of the
next statement is equal to or greater than the indentation of the
current statement, then the current statement cannot be the end of the
block.  The attached patch
0001-Performance-optimization-of-python-info-statement-en.patch takes
advantage of this to improve the performance of
`python-info-statement-ends-block-p'.  Please remember that it assumes
the #77941 patch is applied.

0001-Performance-optimization-of-python-info-statement-en.patch solves
the performance problem with _axes.py, but does not have much effect
on the problem with lines "a = 1" and "b = 2" added above.  The
attached patch
0002-Add-cache-to-Python-block-navigation-functions.patch is an
attempt to introduce a cache to alleviate this problem.

I measured the following to disable the cache for each benchmark.

(/ (car (benchmark-run 10 (progn (thing-at-point 'sexp) (setq python-nav-cache nil)))) 10)

It shows about 1.6 seconds for both "a = 1" and "b = 2" lines.

I believe 0002-Add-cache-to-Python-block-navigation-functions.patch is
a PoC level patch, so I welcome opinions on what you think of this
direction.

--Multipart_Mon_Apr_21_00:05:36_2025-1
Content-Type: application/octet-stream; type=patch; name="0001-Performance-optimization-of-python-info-statement-en.patch"
Content-Disposition: attachment; filename="0001-Performance-optimization-of-python-info-statement-en.patch"
Content-Transfer-Encoding: 7bit

From 760304b6560499674fd41e9132feceb050f603ae Mon Sep 17 00:00:00 2001
From: kobarity <kobarity@HIDDEN>
Date: Sun, 20 Apr 2025 21:14:46 +0900
Subject: [PATCH 1/2] Performance optimization of
 python-info-statement-ends-block-p

* lisp/progmodes/python.el
(python-info-statement-ends-block-p): Add a comparison of the
indentation of the next statement with the indentation of the
current statement.  (Bug#77620)
---
 lisp/progmodes/python.el | 27 +++++++++++++++++++--------
 1 file changed, 19 insertions(+), 8 deletions(-)

diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index b03e4f9efdf..81440cfcfc9 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -6156,14 +6156,25 @@ python-info-statement-starts-block-p
 
 (defun python-info-statement-ends-block-p ()
   "Return non-nil if point is at end of block."
-  (let ((end-of-block-pos (save-excursion
-                            (python-nav-end-of-block)))
-        (end-of-statement-pos (save-excursion
-                                (python-nav-end-of-statement)
-                                (python-util-forward-comment -1)
-                                (point))))
-    (and end-of-block-pos end-of-statement-pos
-         (= end-of-block-pos end-of-statement-pos))))
+  (let* (current-statement
+         (current-indentation (save-excursion
+                                (setq current-statement
+                                      (python-nav-beginning-of-statement))
+                                (current-indentation)))
+         next-statement
+         (next-indentation (save-excursion
+                             (python-nav-forward-statement)
+                             (setq next-statement (point))
+                             (current-indentation))))
+    (unless (and (< current-statement next-statement)
+                 (<= current-indentation next-indentation))
+      (and-let* ((end-of-statement-pos (save-excursion
+                                         (python-nav-end-of-statement)
+                                         (python-util-forward-comment -1)
+                                         (point)))
+                 (end-of-block-pos (save-excursion
+                                     (python-nav-end-of-block))))
+        (= end-of-block-pos end-of-statement-pos)))))
 
 (defun python-info-beginning-of-statement-p ()
   "Return non-nil if point is at beginning of statement."
-- 
2.43.0


--Multipart_Mon_Apr_21_00:05:36_2025-1
Content-Type: application/octet-stream; type=patch; name="0002-Add-cache-to-Python-block-navigation-functions.patch"
Content-Disposition: attachment; filename="0002-Add-cache-to-Python-block-navigation-functions.patch"
Content-Transfer-Encoding: 7bit

From ab1948d91186603a7f799e3e5cf203b1f13399ef Mon Sep 17 00:00:00 2001
From: kobarity <kobarity@HIDDEN>
Date: Sun, 20 Apr 2025 21:14:46 +0900
Subject: [PATCH 2/2] Add cache to Python block navigation functions

* lisp/progmodes/python.el (python-nav-cache),
(python-nav-cache-tick): New variables.
(python-nav-cache-get),
(python-nav-cache-set): New functions.
(python-nav-with-cache): New macro.
(python-nav-beginning-of-block),
(python-nav-end-of-block): New wrapper functions.
(python-nav--beginning-of-block): Renamed from
python-nav-beginning-of-block.
(python-nav--end-of-block): Renamed from
python-nav-end-of-block.  (Bug#77620)
---
 lisp/progmodes/python.el | 52 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)

diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index 81440cfcfc9..08ab94f525b 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -2386,9 +2386,54 @@ python-nav-forward-statement
     (python-nav-beginning-of-statement)
     (setq arg (1+ arg))))
 
+(defvar python-nav-cache nil
+  "Cache to hold the results of navigation functions.")
+
+(defvar python-nav-cache-tick 0
+  "`buffer-chars-modified-tick' when registering the navigation cache.")
+
+(defun python-nav-cache-get (kind)
+  "Get value from the navigation cache.
+If the current buffer is not modified, the navigation cache is searched
+using KIND and the current line number as a key."
+  (and (= (buffer-chars-modified-tick) python-nav-cache-tick)
+       (cdr (assoc (cons kind (line-number-at-pos nil t)) python-nav-cache))))
+
+(defun python-nav-cache-set (kind current target)
+  "Add a key-value pair to the navigation cache.
+Invalidate the navigation cache if the current buffer has been modified.
+Then add a key-value pair to the navigation cache.  The key consists of
+KIND and CURRENT line number, and the value is TARGET position."
+  (let ((tick (buffer-chars-modified-tick)))
+    (when (/= tick python-nav-cache-tick)
+      (setq-local python-nav-cache nil
+                  python-nav-cache-tick tick))
+    (push (cons (cons kind current) target) python-nav-cache)
+    target))
+
+(defmacro python-nav-with-cache (kind func)
+  "Cached version of the navigation FUNC.
+If a value is obtained from the navigation cache using KIND, it will
+navigate there and return the position.  Otherwise, use FUNC to navigate
+and cache the result."
+  `(let ((target (python-nav-cache-get ,kind)))
+     (if target
+         (progn
+           (goto-char target)
+           (point-marker))
+       (let ((current (line-number-at-pos nil t)))
+         (python-nav-cache-set ,kind current (funcall ,func))))))
+
 (defun python-nav-beginning-of-block ()
   "Move to start of current block."
   (interactive "^")
+  (python-nav-with-cache
+   'beginning-of-block #'python-nav--beginning-of-block))
+
+(defun python-nav--beginning-of-block ()
+  "Move to start of current block.
+This is an internal implementation of `python-nav-beginning-of-block'
+without the navigation cache."
   (let ((starting-pos (point)))
     ;; Go to first line beginning a statement
     (while (and (not (bobp))
@@ -2413,6 +2458,13 @@ python-nav-beginning-of-block
 (defun python-nav-end-of-block ()
   "Move to end of current block."
   (interactive "^")
+  (python-nav-with-cache
+   'end-of-block #'python-nav--end-of-block))
+
+(defun python-nav--end-of-block ()
+  "Move to end of current block.
+This is an internal implementation of `python-nav-end-of-block' without
+the navigation cache."
   (when (python-nav-beginning-of-block)
     (let ((block-indentation (current-indentation)))
       (python-nav-end-of-statement)
-- 
2.43.0


--Multipart_Mon_Apr_21_00:05:36_2025-1--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#77620; Package emacs. Full text available.

Message received at 77620 <at> debbugs.gnu.org:


Received: (at 77620) by debbugs.gnu.org; 9 Apr 2025 15:52:29 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed Apr 09 11:52:29 2025
Received: from localhost ([127.0.0.1]:41276 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1u2Xj3-0005O2-BH
	for submit <at> debbugs.gnu.org; Wed, 09 Apr 2025 11:52:29 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10]:53784)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <eliz@HIDDEN>) id 1u2Xj0-0005Nl-FB
 for 77620 <at> debbugs.gnu.org; Wed, 09 Apr 2025 11:52:26 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <eliz@HIDDEN>)
 id 1u2Xiu-0008VL-Vj; Wed, 09 Apr 2025 11:52:20 -0400
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org;
 s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date:
 mime-version; bh=JjAl1Ych6tPbfFh+qKkL8V82OHb5/Kk/G8s6PTxrYl0=; b=D/M8Lt6l+E2m
 bjDVgBpdOIQ50Rwm0g5BFRSpixW5va6ovJ3iYFwm9KtAElqmvb4Pt71v+7ziGcB3PmgoV9zyc7A9I
 7eku0sL6WYOZptZZm1nP0E/0TpUAcmfPi5kAfGpKd1c7AUvb044juzBUf0DgNvRCYxSMXJduHZYvJ
 uHRfWj8bY75rYxBhJ/nFpoBqJb3zah9TLvTLhDBDd4lEFsjpxjjJWdX2HY6ev7NizdewWBbZ1laX7
 5DhMuOh7XLOkV1iSS9nPmVBFFQdMTdeFZE1tkxMihU7kOUDliLONxeNKIRhh5zJnPmsW8xlKMiZhP
 RWGB7/J5PhjSnB/GxwgL4w==;
Date: Wed, 09 Apr 2025 18:52:18 +0300
Message-Id: <86semhqqml.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: kobarity <kobarity@HIDDEN>
In-Reply-To: <eke7cydluz80.wl-kobarity@HIDDEN> (message from kobarity on
 Thu, 10 Apr 2025 00:33:03 +0900)
Subject: Re: bug#77620: thingatpt can be incredibly slow in python-mode buffers
References: <DD4BC1EE-246D-4080-9B93-07D359F8C70E@HIDDEN>
 <86cydnsz5v.fsf@HIDDEN> <eke7cydluz80.wl-kobarity@HIDDEN>
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 77620
Cc: 77620 <at> debbugs.gnu.org, jdtsmith@HIDDEN
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> Date: Thu, 10 Apr 2025 00:33:03 +0900
> From: kobarity <kobarity@HIDDEN>
> Cc: JD Smith <jdtsmith@HIDDEN>,
> 	77620 <at> debbugs.gnu.org
> 
> Eli Zaretskii wrote:
> > 
> > > In #77588 this was shown to lead to long intermittent pauses with eglot in large python buffers, but the issue is more general for any packages using thingatpt in python buffers.
> > 
> > The Lisp profile, which seems to point to the likely culprit, is
> > below.
> > 
> > Maybe kobarity (CC'ed) will have some ideas or suggestions.
> > 
> >          345  89% - ...
> >          343  89%  - cond
> >          343  89%   - let
> >          343  89%    - condition-case
> >          343  89%     - progn
> >          343  89%      - save-excursion
> >          173  44%       - funcall
> >          173  44%        - thing-at-point--end-of-sexp
> >          173  44%         - let
> >          173  44%          - if
> >          173  44%           - condition-case
> >          173  44%            - forward-sexp
> >          173  44%             - python-nav-forward-sexp
> >          173  44%              - python-nav--forward-sexp
> >          173  44%               - python-info-statement-ends-block-p
> >          173  44%                - python-nav-end-of-block
> >           96  24%                 - python-nav-end-of-statement
> >           69  17%                  - syntax-ppss
> >           67  17%                     parse-partial-sexp
> >           27   7%                  - python-info-line-ends-backslash-p
> >           27   7%                   - syntax-ppss
> >           27   7%                      parse-partial-sexp
> >           76  19%                 - python-nav-beginning-of-block
> >           76  19%                  - python-nav-backward-block
> >           76  19%                   - python-nav-forward-block
> >           75  19%                    - python-syntax-context-type
> >           75  19%                     - syntax-ppss
> >           74  19%                        parse-partial-sexp
> >            1   0%                    - python-nav-beginning-of-statement
> >            1   0%                       point-marker
> >            1   0%                   current-indentation
> >          170  44%       - let
> >          170  44%        - if
> >          170  44%         - funcall
> >          170  44%          - thing-at-point--beginning-of-sexp
> >          170  44%           - let
> >          170  44%            - if
> >          170  44%             - forward-sexp
> >          170  44%              - python-nav-forward-sexp
> >          170  44%               - python-nav--forward-sexp
> >          170  44%                - python-info-statement-ends-block-p
> >          170  44%                 - python-nav-end-of-block
> >           95  24%                  - python-nav-end-of-statement
> >           63  16%                   - syntax-ppss
> >           62  16%                      parse-partial-sexp
> >           31   8%                   - python-info-line-ends-backslash-p
> >           31   8%                    - syntax-ppss
> >           30   7%                       parse-partial-sexp
> >            1   0%                     re-search-forward
> >           75  19%                  - python-nav-beginning-of-block
> >           75  19%                   - python-nav-backward-block
> >           75  19%                    - python-nav-forward-block
> >           72  18%                     - python-syntax-context-type
> >           72  18%                      - syntax-ppss
> >           71  18%                         parse-partial-sexp
> >            2   0%                       re-search-backward
> >            1   0%                     - python-nav-beginning-of-statement
> >            1   0%                      - python-info-line-ends-backslash-p
> >            1   0%                       - syntax-ppss
> >            1   0%                          syntax-ppss--data
> >            2   0%  - python-shell-get-process
> >            2   0%   - python-shell-get-buffer
> >            2   0%    - seq-some
> >            2   0%     + seq-do
> >           32   8%   Automatic GC
> >            6   1% - command-execute
> >            6   1%  - call-interactively
> >            6   1%   - byte-code
> >            6   1%    - read-extended-command
> >            6   1%     - read-extended-command-1
> >            6   1%      - completing-read
> >            6   1%       - completing-read-default
> >            6   1%        - read-from-minibuffer
> >            1   0%           redisplay_internal (C function)
> >            2   0%   redisplay_internal (C function)
> 
> Please give me some time as I'm trying to improve performance.

Sure, there's no rush.  TIA.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#77620; Package emacs. Full text available.

Message received at 77620 <at> debbugs.gnu.org:


Received: (at 77620) by debbugs.gnu.org; 9 Apr 2025 15:33:36 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed Apr 09 11:33:35 2025
Received: from localhost ([127.0.0.1]:41209 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1u2XQl-0004MZ-Fv
	for submit <at> debbugs.gnu.org; Wed, 09 Apr 2025 11:33:35 -0400
Received: from mail-pf1-x435.google.com ([2607:f8b0:4864:20::435]:42076)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <kobarity@HIDDEN>)
 id 1u2XQi-0004MF-7j
 for 77620 <at> debbugs.gnu.org; Wed, 09 Apr 2025 11:33:33 -0400
Received: by mail-pf1-x435.google.com with SMTP id
 d2e1a72fcca58-7399838db7fso1024896b3a.0
 for <77620 <at> debbugs.gnu.org>; Wed, 09 Apr 2025 08:33:32 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1744212806; x=1744817606; darn=debbugs.gnu.org;
 h=content-transfer-encoding:mime-version:user-agent:references
 :in-reply-to:subject:cc:to:from:message-id:date:from:to:cc:subject
 :date:message-id:reply-to;
 bh=XZ5plIGL6WpXPuqrrw/NE/tbgrdjy/sWMDOhXtSZvk0=;
 b=RBp5Jh8BIM5wFmu1R8frAX4xJS7fH5po4Xj4K7NKw2G80vnxTUqt/cDuwSiTSN7DRV
 i8XtsRRgNT5Jj7d0pspXRL5l73fyu29Gh//e4odI9f20+4M5Yozj8N3J39JaObK4Dag2
 M3S/rWGiBuPs5+oU1dXgeTxOKPBWjBoegMFTScia+MT2JyOmXdergyFXeCwja5PF9brf
 6IpjSZU/9LS03FP0dh/14eGPePXga27yw3iKre4+9nRPl9cYPqvYc868zoLTW9zQjMIM
 2fexJ7/ORWCVTY/GhV6OZLbAzm3gjmlodi/Ow6k3EZlVpj1EHIAtf6y1xjKRq4QsJ493
 CFKw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1744212806; x=1744817606;
 h=content-transfer-encoding:mime-version:user-agent:references
 :in-reply-to:subject:cc:to:from:message-id:date:x-gm-message-state
 :from:to:cc:subject:date:message-id:reply-to;
 bh=XZ5plIGL6WpXPuqrrw/NE/tbgrdjy/sWMDOhXtSZvk0=;
 b=odrhye/+w3pCh8fR6W3BGvxU0Z6NXwgbEwfs+IsSIvmURH2Q90mHWq4HMKe1RlxppI
 9+X1jzwhHpl3PAW/0D6tMHoQMvALxTarsjfvK9xhYRRHJ6ddGcaKzF4x052BsZXYiKkc
 RLjPjCY9sZsQxQgfqDRaygSpw8cmaLJhb/HBnDkgby8ebpzPIMAu7oqwEHjSU+1ayCQ1
 i0PiEWqfYjdo8UcesBc+HS2jW3tzLLaSsvFbQhqzG/HSDS5AHKLli8Fcg67jQzfDe5ec
 sQXOS0G/dlgXeCI1cF8y+RwLp/GsEkyqZ856yQ0qJMqRecrhM+R/xSmnBjSjgKUJLHEt
 G0XA==
X-Forwarded-Encrypted: i=1;
 AJvYcCUdMIZVferpCSzNwsx6ccxGanuFGV7qvnoIH9UT2yWTnhdBKujr1JQjSkNiHdC4o82kNDvFwg==@debbugs.gnu.org
X-Gm-Message-State: AOJu0YwoXauRC6XzwQXhPHmFL9zgrR1fKBFjcyAbI5cZR7ZEKbSo6erq
 B5/W86RMazTcVfQ4SuXZGuy95bI5D5IgBSk7a0OX/Bj0HIA7AAi7
X-Gm-Gg: ASbGncscaUBxBO8sKgLAEf2rzUbN9q4D56kANX6QKPPcPLjErWomoYns3yJUX3S8bv4
 m7jsl03+zs0x5T6SXVZ6/kO0AB+UBcwPqEt6dJbJ++JQM4qfYhS87uxCRNlUiM30xwjP6939t2/
 Plu8Mupmt4HMdKOmYGKZUMZ0jZRtLQBZxbLfF/jboffdagJ7e+jD1O3nn1LuGt5U2w0m+uTmAlj
 9pMMxrjn+5QVlJ86i10ZjqM5mSwSU5jUYok7PIVy2DOEd1y6adxP2xb1NMhLzX4yLIKyDWBPWgY
 f+LHwuuVY6UseEdhbhG1PsJzB0uGWtcH6lcdR8Lhj9GMSu2EpdYekxNPNBsmADNeYB0cf40=
X-Google-Smtp-Source: AGHT+IFCT/Vc7k8nVGqet2n1KSGbm2tGnPqBfp48tWlRh0imw17XQj+A1fQ8e80DkHnbtu3ZwStCrg==
X-Received: by 2002:a05:6a00:3bc3:b0:732:706c:c4ff with SMTP id
 d2e1a72fcca58-73b9d3d31edmr9068171b3a.7.1744212805702; 
 Wed, 09 Apr 2025 08:33:25 -0700 (PDT)
Received: from localhost (58x12x133x161.ap58.ftth.ucom.ne.jp. [58.12.133.161])
 by smtp.gmail.com with ESMTPSA id
 d2e1a72fcca58-73bb1d68cb1sm1475413b3a.75.2025.04.09.08.33.24
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Wed, 09 Apr 2025 08:33:25 -0700 (PDT)
Date: Thu, 10 Apr 2025 00:33:03 +0900
Message-ID: <eke7cydluz80.wl-kobarity@HIDDEN>
From: kobarity <kobarity@HIDDEN>
To: Eli Zaretskii <eliz@HIDDEN>
Subject: Re: bug#77620: thingatpt can be incredibly slow in python-mode buffers
In-Reply-To: <86cydnsz5v.fsf@HIDDEN>
References: <DD4BC1EE-246D-4080-9B93-07D359F8C70E@HIDDEN>
 <86cydnsz5v.fsf@HIDDEN>
User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue)
 FLIM-LB/1.14.9 (=?ISO-8859-4?Q?Goj=F2?=) APEL-LB/10.8 EasyPG/1.0.0
 Emacs/31.0.50 (x86_64-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO)
MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue")
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: 0.7 (/)
X-Debbugs-Envelope-To: 77620
Cc: 77620 <at> debbugs.gnu.org, JD Smith <jdtsmith@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.3 (/)

Eli Zaretskii wrote:
>=20
> > From: JD Smith <jdtsmith@HIDDEN>
> > Date: Mon, 7 Apr 2025 17:48:49 -0400
> >=20
> > > (/ (car (benchmark-run 10 (thing-at-point 'sexp))) 10)
> >=20
> >=20
> > Try this test at the start of L8817 in this file (no eglot needed; eith=
er python-mode or python-ts-mode is fine, as both show the same issue):
> >=20
> > https://raw.githubusercontent.com/matplotlib/matplotlib/refs/heads/main=
/lib/matplotlib/axes/_axes.py
> > https://raw.githubusercontent.com/matplotlib/matplotlib/refs/heads/main=
/lib/matplotlib/axes/_axes.py=EF=BF=BC
> > _axes
> > Text Document =C2=B7 353 KB
> >=20
> > In #77588 this was shown to lead to long intermittent pauses with eglot=
 in large python buffers, but the issue is more general for any packages us=
ing thingatpt in python buffers.
>=20
> The Lisp profile, which seems to point to the likely culprit, is
> below.
>=20
> Maybe kobarity (CC'ed) will have some ideas or suggestions.
>=20
>          345  89% - ...
>          343  89%  - cond
>          343  89%   - let
>          343  89%    - condition-case
>          343  89%     - progn
>          343  89%      - save-excursion
>          173  44%       - funcall
>          173  44%        - thing-at-point--end-of-sexp
>          173  44%         - let
>          173  44%          - if
>          173  44%           - condition-case
>          173  44%            - forward-sexp
>          173  44%             - python-nav-forward-sexp
>          173  44%              - python-nav--forward-sexp
>          173  44%               - python-info-statement-ends-block-p
>          173  44%                - python-nav-end-of-block
>           96  24%                 - python-nav-end-of-statement
>           69  17%                  - syntax-ppss
>           67  17%                     parse-partial-sexp
>           27   7%                  - python-info-line-ends-backslash-p
>           27   7%                   - syntax-ppss
>           27   7%                      parse-partial-sexp
>           76  19%                 - python-nav-beginning-of-block
>           76  19%                  - python-nav-backward-block
>           76  19%                   - python-nav-forward-block
>           75  19%                    - python-syntax-context-type
>           75  19%                     - syntax-ppss
>           74  19%                        parse-partial-sexp
>            1   0%                    - python-nav-beginning-of-statement
>            1   0%                       point-marker
>            1   0%                   current-indentation
>          170  44%       - let
>          170  44%        - if
>          170  44%         - funcall
>          170  44%          - thing-at-point--beginning-of-sexp
>          170  44%           - let
>          170  44%            - if
>          170  44%             - forward-sexp
>          170  44%              - python-nav-forward-sexp
>          170  44%               - python-nav--forward-sexp
>          170  44%                - python-info-statement-ends-block-p
>          170  44%                 - python-nav-end-of-block
>           95  24%                  - python-nav-end-of-statement
>           63  16%                   - syntax-ppss
>           62  16%                      parse-partial-sexp
>           31   8%                   - python-info-line-ends-backslash-p
>           31   8%                    - syntax-ppss
>           30   7%                       parse-partial-sexp
>            1   0%                     re-search-forward
>           75  19%                  - python-nav-beginning-of-block
>           75  19%                   - python-nav-backward-block
>           75  19%                    - python-nav-forward-block
>           72  18%                     - python-syntax-context-type
>           72  18%                      - syntax-ppss
>           71  18%                         parse-partial-sexp
>            2   0%                       re-search-backward
>            1   0%                     - python-nav-beginning-of-statement
>            1   0%                      - python-info-line-ends-backslash-p
>            1   0%                       - syntax-ppss
>            1   0%                          syntax-ppss--data
>            2   0%  - python-shell-get-process
>            2   0%   - python-shell-get-buffer
>            2   0%    - seq-some
>            2   0%     + seq-do
>           32   8%   Automatic GC
>            6   1% - command-execute
>            6   1%  - call-interactively
>            6   1%   - byte-code
>            6   1%    - read-extended-command
>            6   1%     - read-extended-command-1
>            6   1%      - completing-read
>            6   1%       - completing-read-default
>            6   1%        - read-from-minibuffer
>            1   0%           redisplay_internal (C function)
>            2   0%   redisplay_internal (C function)

Please give me some time as I'm trying to improve performance.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#77620; Package emacs. Full text available.

Message received at 77620 <at> debbugs.gnu.org:


Received: (at 77620) by debbugs.gnu.org; 8 Apr 2025 10:52:56 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Tue Apr 08 06:52:56 2025
Received: from localhost ([127.0.0.1]:59287 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1u26Zb-0002Mo-7X
	for submit <at> debbugs.gnu.org; Tue, 08 Apr 2025 06:52:55 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10]:56270)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <eliz@HIDDEN>) id 1u26ZY-0002MI-5R
 for 77620 <at> debbugs.gnu.org; Tue, 08 Apr 2025 06:52:52 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <eliz@HIDDEN>)
 id 1u26ZS-0001Qv-Rb; Tue, 08 Apr 2025 06:52:46 -0400
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org;
 s=fencepost-gnu-org; h=MIME-version:References:Subject:In-Reply-To:To:From:
 Date; bh=tkQ+s3TH3ALS6p/Q1p7kGss6LiAzN9qlTyP3hQW+bcg=; b=XCsBqgSR3/EwrXee7DRZ
 T6dOIpKEhGJwuVikTDfZCfudns+bGV1fAZrNpqCMCc/MLxUgWaTIaQYLxWMDL+/AFowWpAtj3OYCT
 b57ywpf8jySgIhGZCUPv+21IVw8C/JpXlw6NfYK+OVz/T0JJ4KBrwxKpk5YZZNzlzzZ1pJjjZGG3E
 uMb+zzHqb7tJuPOq2vFtoejhORzRJ/+SFFlGmBr1cl10cZLYEp5qVZQFA0V8kVHHMQCden6Qo7sEZ
 Gu+c5wT4MGNYRV2jTTwp57BmUDigaWEUhuNpqRJKIwCr8QSmJcMPswYib8zAWKGeKdWaTL0NAucRd
 ivjjkHaqRv102w==;
Date: Tue, 08 Apr 2025 13:52:44 +0300
Message-Id: <86cydnsz5v.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: JD Smith <jdtsmith@HIDDEN>, kobarity <kobarity@HIDDEN>
In-Reply-To: <DD4BC1EE-246D-4080-9B93-07D359F8C70E@HIDDEN> (message from JD
 Smith on Mon, 7 Apr 2025 17:48:49 -0400)
Subject: Re: bug#77620: thingatpt can be incredibly slow in python-mode buffers
References: <DD4BC1EE-246D-4080-9B93-07D359F8C70E@HIDDEN>
MIME-version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-Spam-Score: -1.6 (-)
X-Debbugs-Envelope-To: 77620
Cc: 77620 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -2.6 (--)

> From: JD Smith <jdtsmith@HIDDEN>
> Date: Mon, 7 Apr 2025 17:48:49 -0400
> 
> > (/ (car (benchmark-run 10 (thing-at-point 'sexp))) 10)
> 
> 
> Try this test at the start of L8817 in this file (no eglot needed; either python-mode or python-ts-mode is fine, as both show the same issue):
> 
> https://raw.githubusercontent.com/matplotlib/matplotlib/refs/heads/main/lib/matplotlib/axes/_axes.py
> https://raw.githubusercontent.com/matplotlib/matplotlib/refs/heads/main/lib/matplotlib/axes/_axes.py
> _axes
> Text Document · 353 KB
> 
> In #77588 this was shown to lead to long intermittent pauses with eglot in large python buffers, but the issue is more general for any packages using thingatpt in python buffers.

The Lisp profile, which seems to point to the likely culprit, is
below.

Maybe kobarity (CC'ed) will have some ideas or suggestions.

         345  89% - ...
         343  89%  - cond
         343  89%   - let
         343  89%    - condition-case
         343  89%     - progn
         343  89%      - save-excursion
         173  44%       - funcall
         173  44%        - thing-at-point--end-of-sexp
         173  44%         - let
         173  44%          - if
         173  44%           - condition-case
         173  44%            - forward-sexp
         173  44%             - python-nav-forward-sexp
         173  44%              - python-nav--forward-sexp
         173  44%               - python-info-statement-ends-block-p
         173  44%                - python-nav-end-of-block
          96  24%                 - python-nav-end-of-statement
          69  17%                  - syntax-ppss
          67  17%                     parse-partial-sexp
          27   7%                  - python-info-line-ends-backslash-p
          27   7%                   - syntax-ppss
          27   7%                      parse-partial-sexp
          76  19%                 - python-nav-beginning-of-block
          76  19%                  - python-nav-backward-block
          76  19%                   - python-nav-forward-block
          75  19%                    - python-syntax-context-type
          75  19%                     - syntax-ppss
          74  19%                        parse-partial-sexp
           1   0%                    - python-nav-beginning-of-statement
           1   0%                       point-marker
           1   0%                   current-indentation
         170  44%       - let
         170  44%        - if
         170  44%         - funcall
         170  44%          - thing-at-point--beginning-of-sexp
         170  44%           - let
         170  44%            - if
         170  44%             - forward-sexp
         170  44%              - python-nav-forward-sexp
         170  44%               - python-nav--forward-sexp
         170  44%                - python-info-statement-ends-block-p
         170  44%                 - python-nav-end-of-block
          95  24%                  - python-nav-end-of-statement
          63  16%                   - syntax-ppss
          62  16%                      parse-partial-sexp
          31   8%                   - python-info-line-ends-backslash-p
          31   8%                    - syntax-ppss
          30   7%                       parse-partial-sexp
           1   0%                     re-search-forward
          75  19%                  - python-nav-beginning-of-block
          75  19%                   - python-nav-backward-block
          75  19%                    - python-nav-forward-block
          72  18%                     - python-syntax-context-type
          72  18%                      - syntax-ppss
          71  18%                         parse-partial-sexp
           2   0%                       re-search-backward
           1   0%                     - python-nav-beginning-of-statement
           1   0%                      - python-info-line-ends-backslash-p
           1   0%                       - syntax-ppss
           1   0%                          syntax-ppss--data
           2   0%  - python-shell-get-process
           2   0%   - python-shell-get-buffer
           2   0%    - seq-some
           2   0%     + seq-do
          32   8%   Automatic GC
           6   1% - command-execute
           6   1%  - call-interactively
           6   1%   - byte-code
           6   1%    - read-extended-command
           6   1%     - read-extended-command-1
           6   1%      - completing-read
           6   1%       - completing-read-default
           6   1%        - read-from-minibuffer
           1   0%           redisplay_internal (C function)
           2   0%   redisplay_internal (C function)




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#77620; Package emacs. Full text available.

Message received at submit <at> debbugs.gnu.org:


Received: (at submit) by debbugs.gnu.org; 7 Apr 2025 21:49:16 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Mon Apr 07 17:49:15 2025
Received: from localhost ([127.0.0.1]:57308 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1u1uLD-0003VW-IS
	for submit <at> debbugs.gnu.org; Mon, 07 Apr 2025 17:49:15 -0400
Received: from lists.gnu.org ([2001:470:142::17]:60698)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <jdtsmith@HIDDEN>)
 id 1u1uL7-0003Uc-Lq
 for submit <at> debbugs.gnu.org; Mon, 07 Apr 2025 17:49:10 -0400
Received: from eggs.gnu.org ([2001:470:142:3::10])
 by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <jdtsmith@HIDDEN>)
 id 1u1uL1-0001LN-Ov
 for bug-gnu-emacs@HIDDEN; Mon, 07 Apr 2025 17:49:03 -0400
Received: from mail-yb1-xb30.google.com ([2607:f8b0:4864:20::b30])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.90_1) (envelope-from <jdtsmith@HIDDEN>)
 id 1u1uL0-0003cX-10
 for bug-gnu-emacs@HIDDEN; Mon, 07 Apr 2025 17:49:03 -0400
Received: by mail-yb1-xb30.google.com with SMTP id
 3f1490d57ef6-e5dc299deb4so4783317276.1
 for <bug-gnu-emacs@HIDDEN>; Mon, 07 Apr 2025 14:49:01 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1744062540; x=1744667340; darn=gnu.org;
 h=to:date:message-id:subject:mime-version:from:from:to:cc:subject
 :date:message-id:reply-to;
 bh=Q91aJg7/CQMHluKkHcMPvJZxmH1ZTuCl94qL1ZpAgLY=;
 b=Ut97N0m3+6HR2hxbR5W6m9PBgPMNztwKjde3+fsml8U7Z0q9/gdssspdP1mzMzayJE
 3xfKbxiGHDYBgIZ99Qn+m4Z5N63xgP4OoqsonE6YKFhApbMgjCzbiuFaISD/yGiFjtUY
 3zC90bSAOxHzyaFM1UUDDMdKQeyLTkv4gSrKVhWw58UFanZu90RtkPWhhnUhai3h84rT
 /yAY2rgpfcaVkSKw8SxnmAP+RhZaK7SJHYyUBPekemSHCCLYI9hnDsgqlKRlvlwIcPWs
 4LtXMRKk2xUidU1JWzt7DU5VcwtG99sU837IrzTetx4VwurgAenNi/ijsymLsS3QO3jb
 uy5A==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1744062540; x=1744667340;
 h=to:date:message-id:subject:mime-version:from:x-gm-message-state
 :from:to:cc:subject:date:message-id:reply-to;
 bh=Q91aJg7/CQMHluKkHcMPvJZxmH1ZTuCl94qL1ZpAgLY=;
 b=lYXqSqPRuuf5SLSeRKr89gJcCnXcXbZW4nv0QoRvXN42UkWvfmlKffFJVFYZesEei8
 KfARlTumb4ds9awpoY5RAam2+CFmlbKfDAFJsO4buA2BHAF/tuB7iIXi08r3zDGNop68
 ISzRNrKt5NBl/tP6NP+PFcNacBPmKnJOWZ19kM+umf/nRie9H7wI2hLiT/50pI8zQm9U
 n8KAsdpzfZjBa+NP80C2Hp2KA412hHcPsWsvsMCuVwnlM6Oo+1LRlTXoQzL5XByDGMDS
 A+O4zN49/eIV3PZbZosLzCeJXdkN5JuVVt8KjlbWsw5O0dxn1mu0dhH6u5LlE1osVHjY
 GKHQ==
X-Gm-Message-State: AOJu0YxfJc2dUurrtKqj1UDx7hQUx+UmzMo5APHpnP9YCLoP2Y6MbtA7
 zZApaCWxY89yJc/JRcRGEURmPrAW74j/L4eKJUshLjoVdvdXd+ibZ9etKw==
X-Gm-Gg: ASbGncsxJATSp8vzZOklDCuVw7GnLWnZe7yxFSk2U9bkcVEKC0IwQGc0l47EdAGOhbJ
 iBG03/8prfeL+ooOQ1EjD8tEqIuqLv8nKgKiTT84A8kKbK0PzJ5u8F/Qqx16sW0411cwBVrEoS9
 pBPO+wBSugT+SNSXg/QPrlFTBMlFPBLQPAWDBPZuEK5PfB0tic+mYTMOmrOtUBB1lER8bZnN/dJ
 ufSR2Hrr3GwyOLq904cQc/ymGt0Jb3CvE/wcBjGlxKgY9CloSylqZ+1qV0LgEqZNwvd8D61NDZ1
 ACCTGcNOQkvdN2AMXNIoRMGuBSVKOVDmOGWHvrjzXnRhHPleizoMzzzADQKRTw==
X-Google-Smtp-Source: AGHT+IEDKtpZcPWQB7uQ7iWME0tvTSzFg2zvua/dkEKEm3LtIczo0BRrlK5XDXGSYcxHjP6zR2rkfg==
X-Received: by 2002:a05:6902:13ce:b0:e6d:fe4e:2fea with SMTP id
 3f1490d57ef6-e6e1f9c3caemr21391720276.22.1744062540544; 
 Mon, 07 Apr 2025 14:49:00 -0700 (PDT)
Received: from smtpclient.apple ([131.183.188.117])
 by smtp.gmail.com with ESMTPSA id
 3f1490d57ef6-e6e0caa4e08sm2557131276.38.2025.04.07.14.48.59
 for <bug-gnu-emacs@HIDDEN>
 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128);
 Mon, 07 Apr 2025 14:49:00 -0700 (PDT)
From: JD Smith <jdtsmith@HIDDEN>
Content-Type: multipart/alternative;
 boundary="Apple-Mail=_5E795CDF-FFFA-45EF-848B-7DF5E10AF583"
Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3826.400.131.1.6\))
Subject: thingatpt can be incredibly slow in python-mode buffers
Message-Id: <DD4BC1EE-246D-4080-9B93-07D359F8C70E@HIDDEN>
Date: Mon, 7 Apr 2025 17:48:49 -0400
To: bug-gnu-emacs@HIDDEN
X-Mailer: Apple Mail (2.3826.400.131.1.6)
Received-SPF: pass client-ip=2607:f8b0:4864:20::b30;
 envelope-from=jdtsmith@HIDDEN; helo=mail-yb1-xb30.google.com
X-Spam_score_int: -20
X-Spam_score: -2.1
X-Spam_bar: --
X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,
 DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001,
 HTML_IMAGE_RATIO_08=0.001, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001,
 SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no
X-Spam_action: no action
X-Spam-Score: 1.7 (+)
X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org",
 has NOT identified this incoming email as spam.  The original
 message has been attached to this so you can view it or label
 similar future email.  If you have any questions, see
 the administrator of that system for details.
 Content preview: As discussed in Bug#77588: > (/ (car (benchmark-run 10
 (thing-at-point
 'sexp))) 10) Try this test at the start of L8817 in this file (no eglot needed;
 either python-mode or python-ts-mode is fine, as both show the same issue):
 Content analysis details:   (1.7 points, 10.0 required)
 pts rule name              description
 ---- ---------------------- --------------------------------------------------
 0.1 URIBL_SBL_A Contains URL's A record listed in the Spamhaus SBL
 blocklist [URIs: raw.githubusercontent.com]
 0.6 URIBL_SBL Contains an URL's NS IP listed in the Spamhaus SBL
 blocklist [URIs: raw.githubusercontent.com]
 -0.0 SPF_HELO_PASS          SPF: HELO matches SPF record
 0.0 FREEMAIL_FROM          Sender email is commonly abused enduser mail
 provider (jdtsmith[at]gmail.com)
 1.0 SPF_SOFTFAIL           SPF: sender does not match SPF record (softfail)
 -0.0 RCVD_IN_DNSWL_NONE     RBL: Sender listed at https://www.dnswl.org/,
 no trust [2001:470:142:0:0:0:0:17 listed in] [list.dnswl.org]
 0.0 HTML_MESSAGE           BODY: HTML included in message
 0.0 HTML_IMAGE_RATIO_08    BODY: HTML has a low ratio of text to image
 area
X-Debbugs-Envelope-To: submit
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 0.7 (/)


--Apple-Mail=_5E795CDF-FFFA-45EF-848B-7DF5E10AF583
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=utf-8

As discussed in Bug#77588:

> (/ (car (benchmark-run 10 (thing-at-point 'sexp))) 10)


Try this test at the start of L8817 in this file (no eglot needed; =
either python-mode or python-ts-mode is fine, as both show the same =
issue):

=
https://raw.githubusercontent.com/matplotlib/matplotlib/refs/heads/main/li=
b/matplotlib/axes/_axes.py
=
https://raw.githubusercontent.com/matplotlib/matplotlib/refs/heads/main/li=
b/matplotlib/axes/_axes.py=EF=BF=BC
_axes
Text Document =C2=B7 353 KB

In #77588 this was shown to lead to long intermittent pauses with eglot =
in large python buffers, but the issue is more general for any packages =
using thingatpt in python buffers.=

--Apple-Mail=_5E795CDF-FFFA-45EF-848B-7DF5E10AF583
Content-Type: multipart/related;
	type="text/html";
	boundary="Apple-Mail=_2AF2A801-F5C0-408C-9D43-357A4E8E50C2"


--Apple-Mail=_2AF2A801-F5C0-408C-9D43-357A4E8E50C2
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html;
	charset=utf-8

<html><head><meta http-equiv=3D"content-type" content=3D"text/html; =
charset=3Dutf-8"></head><body style=3D"overflow-wrap: break-word; =
-webkit-nbsp-mode: space; line-break: after-white-space;">As discussed =
in Bug#77588:<div><br></div><div><blockquote type=3D"cite" =
style=3D"caret-color: rgb(0, 0, 0); color: rgb(0, 0, 0);">(/ (car =
(benchmark-run 10 (thing-at-point 'sexp))) =
10)</blockquote></div><div><br></div><div><div style=3D"caret-color: =
rgb(0, 0, 0); color: rgb(0, 0, 0);">Try this test at the start of L8817 =
in this file (no eglot needed; either python-mode or python-ts-mode is =
fine, as both show the same issue):</div><div style=3D"caret-color: =
rgb(0, 0, 0); color: rgb(0, 0, 0);"><br></div><div style=3D"caret-color: =
rgb(0, 0, 0); color: rgb(0, 0, 0);"><div><div class=3D"apple-rich-link" =
draggable=3D"true" role=3D"link" =
data-url=3D"https://raw.githubusercontent.com/matplotlib/matplotlib/refs/h=
eads/main/lib/matplotlib/axes/_axes.py" style=3D"-webkit-user-select: =
all; -webkit-user-drag: element; display: =
inline-block;"></div></div></div><div style=3D"display: block;"><div =
style=3D"-webkit-user-select: all; -webkit-user-drag: element; display: =
inline-block;" class=3D"apple-rich-link" draggable=3D"true" role=3D"link" =
data-url=3D"https://raw.githubusercontent.com/matplotlib/matplotlib/refs/h=
eads/main/lib/matplotlib/axes/_axes.py"><a =
style=3D"border-radius:10px;font-family:-apple-system, Helvetica, Arial, =
sans-serif;display:block;-webkit-user-select:none;width:228px;user-select:=
none;-webkit-user-modify:read-only;user-modify:read-only;overflow:hidden;t=
ext-decoration:none;" class=3D"lp-rich-link" rel=3D"nofollow" =
href=3D"https://raw.githubusercontent.com/matplotlib/matplotlib/refs/heads=
/main/lib/matplotlib/axes/_axes.py" dir=3D"ltr" role=3D"button" =
draggable=3D"false" width=3D"228"><table =
style=3D"table-layout:fixed;border-collapse:collapse;width:228px;backgroun=
d-color:#E5E6E9;font-family:-apple-system, Helvetica, Arial, =
sans-serif;" class=3D"lp-rich-link-emailBaseTable" cellpadding=3D"0" =
cellspacing=3D"0" border=3D"0" width=3D"228"><tbody><tr><td =
vertical-align=3D"center" align=3D"center"><img =
style=3D"width:228px;filter:brightness(0.97);height:228px;" width=3D"228" =
height=3D"228" draggable=3D"false" class=3D"lp-rich-link-mediaImage" =
alt=3D"preview.png" =
src=3D"cid:39E1D319-4829-49C1-BE36-15E2FBEF8F18"></td></tr><tr><td =
vertical-align=3D"center"><table bgcolor=3D"#E5E6E9" cellpadding=3D"0" =
cellspacing=3D"0" width=3D"228" =
style=3D"table-layout:fixed;font-family:-apple-system, Helvetica, Arial, =
sans-serif;background-color:rgba(229, 230, 233, 1);" =
class=3D"lp-rich-link-captionBar"><tbody><tr><td style=3D"padding:8px =
0px 8px 0px;" class=3D"lp-rich-link-captionBar-textStackItem"><div =
style=3D"max-width:100%;margin:0px 16px 0px 16px;overflow:hidden;" =
class=3D"lp-rich-link-captionBar-textStack"><div =
style=3D"word-wrap:break-word;font-weight:500;font-size:12px;overflow:hidd=
en;text-overflow:ellipsis;text-align:left;" =
class=3D"lp-rich-link-captionBar-textStack-topCaption-leading"><a =
rel=3D"nofollow" =
href=3D"https://raw.githubusercontent.com/matplotlib/matplotlib/refs/heads=
/main/lib/matplotlib/axes/_axes.py" style=3D"text-decoration: none" =
draggable=3D"false"><font color=3D"#272727" style=3D"color: rgba(0, 0, =
0, 0.847059);">_axes</font></a></div><div =
style=3D"word-wrap:break-word;font-weight:400;font-size:11px;overflow:hidd=
en;text-overflow:ellipsis;text-align:left;" =
class=3D"lp-rich-link-captionBar-textStack-bottomCaption-leading"><a =
rel=3D"nofollow" =
href=3D"https://raw.githubusercontent.com/matplotlib/matplotlib/refs/heads=
/main/lib/matplotlib/axes/_axes.py" style=3D"text-decoration: none" =
draggable=3D"false"><font color=3D"#808080" style=3D"color: rgba(0, 0, =
0, 0.498039);">Text Document =C2=B7 353 =
KB</font></a></div></div></td></tr></tbody></table></td></tr></tbody></tab=
le></a></div></div></div><div><br></div><div>In #77588 this was shown to =
lead to long intermittent pauses with eglot in large python buffers, but =
the issue is more general for any packages using thingatpt in python =
buffers.</div></body></html>=

--Apple-Mail=_2AF2A801-F5C0-408C-9D43-357A4E8E50C2
Content-Transfer-Encoding: base64
Content-Disposition: inline;
	filename=preview.png
Content-Type: image/png;
	x-unix-mode=0666;
	name="preview.png"
Content-Id: <39E1D319-4829-49C1-BE36-15E2FBEF8F18>

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
--Apple-Mail=_2AF2A801-F5C0-408C-9D43-357A4E8E50C2--

--Apple-Mail=_5E795CDF-FFFA-45EF-848B-7DF5E10AF583--




Acknowledgement sent to JD Smith <jdtsmith@HIDDEN>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs@HIDDEN. Full text available.
Report forwarded to bug-gnu-emacs@HIDDEN:
bug#77620; Package emacs. Full text available.
Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.
Last modified: Sat, 26 Apr 2025 11:30:02 UTC

GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997 nCipher Corporation Ltd, 1994-97 Ian Jackson.