2024-09-30 01:26:15 发布
网友
前几天我在做一些Python基准测试,发现了一些有趣的东西。下面是两个或多或少做相同事情的循环。循环1的执行时间大约是循环2的两倍。
回路1:
int i = 0 while i < 100000000: i += 1
回路2:
for n in range(0,100000000): pass
为什么第一个循环要慢得多?我知道这是个微不足道的例子,但它激起了我的兴趣。range()函数有什么特别的地方比用同样的方法递增变量更有效吗?
查看python字节码的反汇编,您可能会得到一个更具体的想法
使用while循环:
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个操作
使用范围:
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个操作
运行C代码的时间比intepretor短得多,可以忽略不计。
必须说,在while循环中有很多对象的创建和销毁。
i += 1
同:
i = i + 1
但由于Python int是不可变的,所以它不会修改现有的对象;而是创建一个具有新值的全新对象。基本上是:
i = new int(i + 1) # Using C++ or Java-ish syntax
垃圾收集器还将有大量的清理工作要做。 “创建对象是昂贵的”。
range()在C中实现,而i += 1在C中解释。
range()
使用xrange()可以使它在处理大量数据时更快。从Python 3.0开始range()与前面的xrange()相同。
xrange()
查看python字节码的反汇编,您可能会得到一个更具体的想法
使用while循环:
循环体有10个操作
使用范围:
循环体有3个操作
运行C代码的时间比intepretor短得多,可以忽略不计。
必须说,在while循环中有很多对象的创建和销毁。
同:
但由于Python int是不可变的,所以它不会修改现有的对象;而是创建一个具有新值的全新对象。基本上是:
垃圾收集器还将有大量的清理工作要做。 “创建对象是昂贵的”。
range()
在C中实现,而i += 1
在C中解释。使用
xrange()
可以使它在处理大量数据时更快。从Python 3.0开始range()
与前面的xrange()
相同。相关问题 更多 >
编程相关推荐