首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的代码显示'for-loop‘的效率比’code‘的效率高?

为什么我的代码显示'for-loop‘的效率比’code‘的效率高?
EN

Stack Overflow用户
提问于 2019-08-16 18:04:10
回答 3查看 48关注 0票数 0

为什么我的代码显示'for-loop‘的效率比’code‘的效率高?

代码语言:javascript
复制
# CODE-1:

import time                      
start_time = time.time()          
for i in range(10000000):
    1
end_time = time.time()             
run_time = end_time - start_time   
print('run_time1: ', run_time)


# CODE-2
start_time = time.time()          
[1 for i in range(10000000)]
end_time = time.time()             
run_time = end_time - start_time  
print('run_time2: ', run_time)

# The results:
(1) run_time1:  0.5030415058135986
(2) run_time2:  1.1129977703094482
EN

回答 3

Stack Overflow用户

发布于 2019-08-16 18:21:27

不同之处在于,使用comprehension创建list,使用for-loop仅调用1,其中最多只有一些数学表达式

代码语言:javascript
复制
for i in range(10000000):
    1 # calling `1`, only expression

[1 for i in range(10000000)] # this creates list so there is more things to do than in first example
票数 2
EN

Stack Overflow用户

发布于 2019-08-16 18:23:34

虽然这两个代码片段都没有做任何有用的事情(它们没有副作用,也不返回任何东西),但第二个版本实际上必须构造一个list对象,这会拖累它的性能。在Python 3.7+中运行:

代码语言:javascript
复制
>>> import dis
>>> dis.dis('''for i in range(10000000): 1''')
  1           0 SETUP_LOOP              16 (to 18)
              2 LOAD_NAME                0 (range)
              4 LOAD_CONST               0 (10000000)
              6 CALL_FUNCTION            1
              8 GET_ITER
        >>   10 FOR_ITER                 4 (to 16)
             12 STORE_NAME               1 (i)
             14 JUMP_ABSOLUTE           10
        >>   16 POP_BLOCK
        >>   18 LOAD_CONST               1 (None)
             20 RETURN_VALUE
>>> dis.dis('''[1 for i in range(10000000)]''')
  1           0 LOAD_CONST               0 (<code object <listcomp> at 0x7f974a725db0, file "<dis>", line 1>)
              2 LOAD_CONST               1 ('<listcomp>')
              4 MAKE_FUNCTION            0
              6 LOAD_NAME                0 (range)
              8 LOAD_CONST               2 (10000000)
             10 CALL_FUNCTION            1
             12 GET_ITER
             14 CALL_FUNCTION            1
             16 RETURN_VALUE

Disassembly of <code object <listcomp> at 0x7f974a725db0, file "<dis>", line 1>:
  1           0 BUILD_LIST               0
              2 LOAD_FAST                0 (.0)
        >>    4 FOR_ITER                 8 (to 14)
              6 STORE_FAST               1 (i)
              8 LOAD_CONST               0 (1)
             10 LIST_APPEND              2
             12 JUMP_ABSOLUTE            4
        >>   14 RETURN_VALUE

您可以看到,listcomp对象比第一个循环做了更多的工作:每次迭代都执行BUILD_LIST和LIST_APPEND。

票数 2
EN

Stack Overflow用户

发布于 2019-08-16 18:51:33

正如其他人解释的那样,您的循环不会构建列表,因此速度更快。适当的比较应该如下所示。

循环:

代码语言:javascript
复制
l = []
for i in range(10000000):
    l.append(1)

列表理解:

代码语言:javascript
复制
l = [1 for i in range(10000000)]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57522696

复制
相关文章

相似问题

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