为什么生成器更快?
Why are generators faster?
我知道生成器比迭代器快。我也明白生成器可以使用 for
循环语法来实现。例如:
import time
startT = time.time()
def myGen(n):
for i in range(n):
yield x
def myIter(n):
for i in range(n):
pass
def main():
n=100
startT=time.time()
myIter(n)
print 'myIter took ', time.time() - startT
startT=time.time()
myGen(n)
print 'myGen(n) took ', time.time() - startT
这只是结果的一个例子:
myIter took 0.09234782
myGen(n) took 0.017847266
因为它使用了 for
循环语法,所以我不明白它为什么比迭代器快。这个生成器使用迭代器,因为 "for" 循环是使用迭代器实现的。如果你对这些进行计时,生成器会始终更快。当生成器使用迭代器时,这是为什么?
谢谢。
在您的代码中,myIter(n)
确实有效——它循环了 100 次。
另一方面,myGen(n)
只是构建生成器——仅此而已。它不算到 100。您所做的只是计算构建对象所需的时间,而您正在以一种不可靠的方式对其进行计时。如果我们使用timeit
(这里使用IPython使事情更简单):
>>> %timeit myIter(100)
1000000 loops, best of 3: 1 µs per loop
>>> %timeit myGen(100)
10000000 loops, best of 3: 163 ns per loop
>>> %timeit myGen(10**1000)
10000000 loops, best of 3: 163 ns per loop
而且我们看到 myGen(n)
时间独立于 n
,因为它什么也没做。事实上,我们可以看到您的代码从未以其他方式执行过:
>>> list(myGen(100))
Traceback (most recent call last):
File "<ipython-input-11-dd43d937402a>", line 1, in <module>
list(myGen(100))
File "<ipython-input-1-ba968e48e9fd>", line 3, in myGen
yield x
NameError: name 'x' is not defined
如果我们修正这个拼写错误,然后尝试一种快速的方法来使用生成器,我们会得到类似
的结果
>>> %timeit myIter(100)
1000000 loops, best of 3: 1 µs per loop
>>> %timeit consume(myGen(100), 100)
100000 loops, best of 3: 3.44 µs per loop
并且生成器版本较慢,这是经常发生的情况。
我知道生成器比迭代器快。我也明白生成器可以使用 for
循环语法来实现。例如:
import time
startT = time.time()
def myGen(n):
for i in range(n):
yield x
def myIter(n):
for i in range(n):
pass
def main():
n=100
startT=time.time()
myIter(n)
print 'myIter took ', time.time() - startT
startT=time.time()
myGen(n)
print 'myGen(n) took ', time.time() - startT
这只是结果的一个例子:
myIter took 0.09234782
myGen(n) took 0.017847266
因为它使用了 for
循环语法,所以我不明白它为什么比迭代器快。这个生成器使用迭代器,因为 "for" 循环是使用迭代器实现的。如果你对这些进行计时,生成器会始终更快。当生成器使用迭代器时,这是为什么?
谢谢。
在您的代码中,myIter(n)
确实有效——它循环了 100 次。
myGen(n)
只是构建生成器——仅此而已。它不算到 100。您所做的只是计算构建对象所需的时间,而您正在以一种不可靠的方式对其进行计时。如果我们使用timeit
(这里使用IPython使事情更简单):
>>> %timeit myIter(100)
1000000 loops, best of 3: 1 µs per loop
>>> %timeit myGen(100)
10000000 loops, best of 3: 163 ns per loop
>>> %timeit myGen(10**1000)
10000000 loops, best of 3: 163 ns per loop
而且我们看到 myGen(n)
时间独立于 n
,因为它什么也没做。事实上,我们可以看到您的代码从未以其他方式执行过:
>>> list(myGen(100))
Traceback (most recent call last):
File "<ipython-input-11-dd43d937402a>", line 1, in <module>
list(myGen(100))
File "<ipython-input-1-ba968e48e9fd>", line 3, in myGen
yield x
NameError: name 'x' is not defined
如果我们修正这个拼写错误,然后尝试一种快速的方法来使用生成器,我们会得到类似
的结果>>> %timeit myIter(100)
1000000 loops, best of 3: 1 µs per loop
>>> %timeit consume(myGen(100), 100)
100000 loops, best of 3: 3.44 µs per loop
并且生成器版本较慢,这是经常发生的情况。