CPython循环优化

CPython循环优化,python,optimization,compilation,cpython,Python,Optimization,Compilation,Cpython,有人能给我解释一下为什么CPython没有像循环不变优化这样的循环优化吗? 例如: for i in range(100000000000): pass cpython不会跳过循环并花费一些时间来完成执行; while循环也会发生这种情况。因为在运行循环之前,python不知道范围是什么,因为内置代码可以被覆盖。如果我这样做 class range: def __init__(self, n): self.n = n global x

有人能给我解释一下为什么CPython没有像循环不变优化这样的循环优化吗? 例如:

for i in range(100000000000):
    pass
cpython不会跳过循环并花费一些时间来完成执行;
while循环也会发生这种情况。

因为在运行循环之前,python不知道
范围是什么,因为内置代码可以被覆盖。如果我这样做

class range:
    def __init__(self, n):
        self.n = n
        global x 
        x = 0
    def __iter__(self):
       global x
       while x < self.n:
           yield x
           x += 1

for i in range(20): pass
print(x)  # prints 20
类别范围:
定义初始化(self,n):
self.n=n
全球x
x=0
定义(自我):
全球x
而x

您可以看到,在动态语言中很难对这样的事情进行优化,因为python在运行循环之前不知道
范围是什么,因为内置内容可以被覆盖。如果我这样做

class range:
    def __init__(self, n):
        self.n = n
        global x 
        x = 0
    def __iter__(self):
       global x
       while x < self.n:
           yield x
           x += 1

for i in range(20): pass
print(x)  # prints 20
类别范围:
定义初始化(self,n):
self.n=n
全球x
x=0
定义(自我):
全球x
而x

您可以看到,在动态语言中很难优化这样的事情

哪个版本的cpythonI可以更改
range
的值,从而使循环发挥作用。关于Python优化的一般主题,有相当多的文献。此资源可能是一个良好的开端:感谢链接Brunow,它的cpythonI版本可以更改
range
的值,以便循环执行某些操作。关于Python优化的一般主题,有相当多的文献。这个资源可能是一个很好的开始:感谢brunoyes的链接,我理解,但是while循环也会发生这种情况,它们无法验证。这没有任何意义。如何优化while循环?如果“for”有意义,为什么“while”没有意义?所有静态编译器都是这样。所有静态编译器都是什么?请注意,从技术上讲,它可以将对象的
tpu next
(名称可能错误,我记不清)成员与内置的无副作用实现列表进行比较,但对于极不可能出现的情况,它会使代码更加复杂。因为您比较的是本质上是静态指针的实现,而不是名称,所以您不存在动态性问题。但是,这又是毫无意义和困难的,它为实际可能出现的情况引入了开销。是的,我理解,但是while循环也会发生这种情况,它们无法验证。这没有任何意义。如何优化while循环?如果“for”有意义,为什么“while”没有意义?所有静态编译器都是这样。所有静态编译器都是什么?请注意,从技术上讲,它可以将对象的
tpu next
(名称可能错误,我记不清)成员与内置的无副作用实现列表进行比较,但对于极不可能出现的情况,它会使代码更加复杂。因为您比较的是本质上是静态指针的实现,而不是名称,所以您不存在动态性问题。但同样,这是毫无意义和困难的,它为实际可能发生的情况引入了开销。