首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么在Python中对range()进行循环要比使用while循环快?

为什么在Python中对range()进行循环要比使用while循环快?
EN

Stack Overflow用户
提问于 2009-05-15 15:06:42
回答 5查看 68.1K关注 0票数 90

前几天,我正在做一些Python基准测试,我发现了一些有趣的事情。下面是两个循环,它们或多或少做了相同的事情。循环1的执行时间大约是循环2的两倍。

循环1:

代码语言:javascript
复制
int i = 0
while i < 100000000:
  i += 1

循环2:

代码语言:javascript
复制
for n in range(0,100000000):
  pass

为什么第一个循环要慢得多?我知道这是一个微不足道的例子,但它激起了我的兴趣。range()函数有没有什么特别之处,使它比以同样的方式递增变量更有效?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-05-15 15:27:08

查看python字节码的反汇编,您可能会有更具体的想法。

使用while循环:

代码语言:javascript
复制
1           0 LOAD_CONST               0 (0)
            3 STORE_NAME               0 (i)

2           6 SETUP_LOOP              28 (to 37)
      >>    9 LOAD_NAME                0 (i)              # <-
           12 LOAD_CONST               1 (100000000)      # <-
           15 COMPARE_OP               0 (<)              # <-
           18 JUMP_IF_FALSE           14 (to 35)          # <-
           21 POP_TOP                                     # <-

3          22 LOAD_NAME                0 (i)              # <-
           25 LOAD_CONST               2 (1)              # <-
           28 INPLACE_ADD                                 # <-
           29 STORE_NAME               0 (i)              # <-
           32 JUMP_ABSOLUTE            9                  # <-
      >>   35 POP_TOP
           36 POP_BLOCK

循环体有10个操作

使用范围:

代码语言:javascript
复制
1           0 SETUP_LOOP              23 (to 26)
            3 LOAD_NAME                0 (range)
            6 LOAD_CONST               0 (0)
            9 LOAD_CONST               1 (100000000)
           12 CALL_FUNCTION            2
           15 GET_ITER
      >>   16 FOR_ITER                 6 (to 25)        # <-
           19 STORE_NAME               1 (n)            # <-

2          22 JUMP_ABSOLUTE           16                # <-
      >>   25 POP_BLOCK
      >>   26 LOAD_CONST               2 (None)
           29 RETURN_VALUE

循环体有3个op

运行C代码的时间比intepretor短得多,可以忽略不计。

票数 173
EN

Stack Overflow用户

发布于 2009-05-15 15:18:03

range()是用C实现的,而i += 1是解释的。

使用xrange()可以使处理大数的速度更快。从Python3.0开始,range()与之前的xrange()相同。

票数 39
EN

Stack Overflow用户

发布于 2013-04-18 08:54:44

必须指出的是,while循环进行了大量的对象创建和销毁。

代码语言:javascript
复制
i += 1

与以下内容相同:

代码语言:javascript
复制
i = i + 1

但是因为Python int是不可变的,所以它不会修改现有的对象;相反,它会创建一个具有新值的全新对象。它基本上是:

代码语言:javascript
复制
i = new int(i + 1)   # Using C++ or Java-ish syntax

垃圾收集器还将有大量的清理工作要做。“创建对象的代价很高”。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/869229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档