【发布时间】:2016-01-17 01:30:36
【问题描述】:
问题很简单,我有以下代码在 python2 中做同样的事情:
for _ in range(n): # or xrange(),they have similar performance according to my test
pass
i = 0
while i < n:
i+=1
pass
for循环比while循环快,当n = 1000000时,每个大约需要0.105544和0.2389421
- 从表面上看,while 循环正在执行增量和边界检查,但据我所知,生成器或迭代器必须执行相同的量辛勤工作,所以如果完成的工作相同,为什么一个比另一个快?
def generator(n):
i = 0
while i < n:
yield i
i += 1
- 在迭代器的情况下,通常有一个成员函数调用next,每次调用都会返回“迭代器中的下一项”,对我来说,这意味着 很多 函数调用,因此堆栈上的巨大开销(更多的汇编代码来执行推送和弹出堆栈)并且根据我对协程(生成器)的了解,它试图规避这通过创建一个新的分离堆栈(就像线程一样,它管理自己的程序计数器),虽然它不再处理大量的函数调用,但它与线程具有相同的问题,即上下文切换的开销强>.
当 while 循环没有遇到我上面提到的任何开销时,它怎么能更慢?
【问题讨论】:
标签: python performance for-loop while-loop coroutine