Path: csiph.com!fu-berlin.de!uni-berlin.de!not-for-mail From: Chris Angelico Newsgroups: comp.lang.python Subject: Re: Detecting repeated subsequences of identical items Date: Fri, 22 Apr 2016 01:02:27 +1000 Lines: 38 Message-ID: References: <571843f9$0$1585$c3e8da3$5496439d@news.astraweb.com> <5718c457$0$1605$c3e8da3$5496439d@news.astraweb.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 X-Trace: news.uni-berlin.de NZWi3QAI3bLOO579cdYT1Q+VMQRSSnGBBddHsPjSOYww== Return-Path: X-Original-To: python-list@python.org Delivered-To: python-list@mail.python.org X-Spam-Status: OK 0.000 X-Spam-Evidence: '*H*': 1.00; '*S*': 0.00; 'received:209.85.223': 0.03; 'overflow': 0.07; 'see.': 0.07; 'cc:addr:python-list': 0.09; '22,': 0.09; 'benjamin': 0.09; 'exceptions,': 0.09; 'finite': 0.09; 'exception': 0.13; 'stack': 0.13; 'def': 0.13; '12:30': 0.16; '2016': 0.16; 'cc:name:python list': 0.16; 'from:addr:rosuav': 0.16; 'from:name:chris angelico': 0.16; 'hits': 0.16; 'problem).': 0.16; 'received:io': 0.16; 'received:psf.io': 0.16; 'sequence.': 0.16; 'subject:Detecting': 0.16; 'wrote:': 0.16; 'have:': 0.18; '>>>': 0.20; '(not': 0.20; 'cc:2**0': 0.20; 'cc:addr:python.org': 0.20; 'am,': 0.23; 'bit': 0.23; 'forgot': 0.23; 'header:In-Reply-To:1': 0.24; 'chris': 0.26; 'helpful': 0.27; 'point.': 0.27; 'fri,': 0.27; 'message- id:@mail.gmail.com': 0.27; 'sequence': 0.27; 'anywhere': 0.30; 'that.': 0.30; 'up.': 0.32; 'usually': 0.33; 'received:google.com': 0.35; 'but': 0.36; 'there': 0.36; 'lines': 0.36; 'received:209.85': 0.36; 'subject:: ': 0.37; "won't": 0.38; 'received:209': 0.38; 'end': 0.39; 'goes': 0.39; 'well.': 0.40; "you'll": 0.61; 'leading': 0.61; 'leaving': 0.63; 'limit': 0.65; 'situation': 0.67; 'increasing': 0.76; 'chrisa': 0.84; 'oscar': 0.84; 'to:none': 0.91 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:cc; bh=8wB1LDk+RwGB03Pa1PEmjj9QYKzaGr2jQBQp2DJPy4k=; b=aExnZjJXMh1LLtvFnzq/3ERJMEfaLcJr+aKsVrKxyyoQDNUBLRFc89bw7NHZdJfpCe XNPbSP85dqNmhwYeeVWcu9/tKIALaxE4lbavi02Bk7OAw9RV2+rj78cuvED2Yhz86Y6y Hfbc+NYmemOCAlMrn90WRt3E5z65O1PIer41FfHiLxJGQ2FmAoVUC1sVHmzU+O88oRgV RWGOip/Io0GwDnDfRyvlsFcjg8KvoDuxjI2vVfTnqQDdxD431+8P+B/F/LOFuB50FVv/ jHlKzJMAXht/+sUz+z1GWd8Je2ivPUtYh/LUixfpN7CgdRxqQUoqJ5g1A27sxGG3rElL gxvw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:cc; bh=8wB1LDk+RwGB03Pa1PEmjj9QYKzaGr2jQBQp2DJPy4k=; b=lLWl17VJtOMv49hyIKqYd9oJYD5a+zuE7u2xHWwGqkfIUpk2vQ3eR+pai8msrmiQkQ 08A7sME+YCjBuZw8zm3d6T8gBJjPYI9DMnNAgw21ZATFm/II3zfDPtjSHArIJKoeciBq XWkd5iWG6reL3zwm0fXEAvzxLjtzwT742N5g+7duQ6i4+7I//pwYiWMRnxvpWvjbFkYd nONlmu4UZUdRSRbr4aoZ+HBlT5BIWpwWMu45uIjdCdmJYkCDOmatJ2+JPH0qbfUgLCvx U0qDHjSm+Pdcrcw2Y8tbrjziYSIirnT73Ujuf4ckVZULDsnup5wLgZcaEXejaEUTwZtL K4DA== X-Gm-Message-State: AOPr4FUIOgjDoVUBipxkqkO1mx0dkDUxnf8JYiAJVdsRiLXT/6RKk4ESgh8OynIHlna0SxCY+kNCvTJ+ut3fvg== X-Received: by 10.107.18.232 with SMTP id 101mr3956004ios.157.1461250947691; Thu, 21 Apr 2016 08:02:27 -0700 (PDT) In-Reply-To: X-BeenThere: python-list@python.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: General discussion list for the Python programming language List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Mailman-Original-Message-ID: X-Mailman-Original-References: <571843f9$0$1585$c3e8da3$5496439d@news.astraweb.com> <5718c457$0$1605$c3e8da3$5496439d@news.astraweb.com> Xref: csiph.com comp.lang.python:107455 On Fri, Apr 22, 2016 at 12:30 AM, Oscar Benjamin wrote: > On 21 April 2016 at 15:12, Chris Angelico wrote: >> On Fri, Apr 22, 2016 at 12:01 AM, Oscar Benjamin >> wrote: >>> In the recursive stack overflow case what you'll usually have is >>> >>> 1) A few frames leading up to the start of recursion >>> 2) A long repetitive sequence of frames >>> 3) A few frames at the end showing how the exception was ultimately triggered. >>> >>> You just need to find the cycle that makes that big long sequence. >> >> If the stack got overflowed, there won't usually be a part 3, as part >> 2 is the bit that hits sys.recursionlimit (unless increasing the >> recursion limit by a finite number would solve the problem). For other >> exceptions, yes, this is what you'd see. > > If you have: > > def f(x): > return g(x+1) > > def g(x): > x = h(x) # <-- stack can overflow inside here > return f(x+1) > > # etc. > > So you have a long sequence that goes f, g, f, g but at the end the > stack can overflow while (not recursively) calling h leaving a small > non-cyclic part at the end. Right, good point. Forgot about that. So this situation can be triggered by anywhere up to lines up. Not as helpful an optimization now. Oh well. ChrisA