Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Regression of 3.13.1 with iterator creation being duplicated #127682

Closed
Labels
interpreter-core(Objects, Python, Grammar, and Parser dirs)type-bugAn unexpected behavior, bug, or error
@kayhayen

Description

@kayhayen

Bug report

Bug description:

For my Python compiler Nuitka, I use CPython as the oracle of what the correct behaviour is. I am running some tests that I used to clarify the behavior from decades ago, in this case I wanted to know when exactly the iterator creation is used. I striped this test a bunch, so the regression is still visible. I first noticed the issue on GitHub Actions, where 3.13.0 got replaced with 3.13.1 for Windows and Linux, but it applies to all OSes. See below for a diff, that the same iterator is created multiple times.

""" Generator expression tests"""from __future__importprint_functionimportinspectprint("Generator expression that demonstrates the timing:")defiteratorCreationTiming():defgetIterable(x):print("Getting iterable",x)returnIterable(x)classIterable:def__init__(self,x):self.x=x# pylint: disable=invalid-nameself.values=list(range(x))self.count=0def__iter__(self):print("Giving iterator now",self.x)returnselfdef__next__(self):print("Next of",self.x,"is",self.count)iflen(self.values)>self.count:self.count+=1returnself.values[self.count-1]else:print("Raising StopIteration for",self.x)raiseStopIteration# Python2/3 compatibility.next=__next__def__del__(self):print("Deleting",self.x)gen= ((y,z)foryingetIterable(3)forzingetIterable(2))print("next value is",next(gen))res=tuple(gen)print("remaining generator is",res)try:next(gen)exceptStopIteration:print("Usage past end gave StopIteration exception as expected.")try:print("Generator state then is",inspect.getgeneratorstate(gen))exceptAttributeError:passprint("Its frame is now",gen.gi_frame)print("Early aborting generator:")gen2= ((y,z)foryingetIterable(3)forzingetIterable(2))delgen2iteratorCreationTiming()

The unified diff between 3.13.0 output (and basically all Python versions before) and 3.13.1 output.

--- out-3.13.0.txt      2024-12-06 12:37:19.447115100 +0100+++ out-3.13.1.txt      2024-12-06 12:37:23.452239500 +0100@@ -1,9 +1,11 @@ Generator expression that demonstrates the timing: Getting iterable 3 Giving iterator now 3+Giving iterator now 3 Next of 3 is 0 Getting iterable 2 Giving iterator now 2+Giving iterator now 2 Next of 2 is 0 next value is (0, 0) Next of 2 is 1@@ -13,6 +15,7 @@ Next of 3 is 1 Getting iterable 2 Giving iterator now 2+Giving iterator now 2 Next of 2 is 0 Next of 2 is 1 Next of 2 is 2@@ -21,6 +24,7 @@ Next of 3 is 2 Getting iterable 2 Giving iterator now 2+Giving iterator now 2 Next of 2 is 0

The duplicated prints out the iterator creation are new. This is not optimal and new. I don't know if the iterator being through a slot cause cause this or what it is. I checked ifgenerator.c changed but I think it didn't at all.

My self compiled Python 3.13.1 for Linux and the official Windows download agree in behaviour.

CPython versions tested on:

3.13

Operating systems tested on:

Linux, Windows

Linked PRs

Metadata

Metadata

Assignees

No one assigned

    Labels

    interpreter-core(Objects, Python, Grammar, and Parser dirs)type-bugAn unexpected behavior, bug, or error

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions


      [8]ページ先頭

      ©2009-2025 Movatter.jp