Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么发电机速度更快?_Python_Iterator_Generator - Fatal编程技术网

Python 为什么发电机速度更快?

Python 为什么发电机速度更快?,python,iterator,generator,Python,Iterator,Generator,我知道生成器比迭代器快。我也知道生成器可以使用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() myIte

我知道生成器比迭代器快。我也知道生成器可以使用
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使事情更简单):

我们看到,
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

而且生成器的版本比较慢,通常情况下也是如此。

“我知道生成器比迭代器快。”-它们不是。为什么你认为他们是?生成器是迭代器的一种。生成器并不比迭代器快。生成器是迭代器。通常情况下,生成器函数实际上速度较慢,但内存效率更高。目前还不清楚您认为哪种代码比它快。你能在你的问题中包括这一点吗?另外,将变量打印到标准输出也会降低应用程序的速度。首先,你只进行了一次测试,而不是数千次。其次,
time.time()
不是一个精确的计时器。第三,生成器只创建循环并进行一次迭代,而另一个函数创建循环,然后迭代整个循环。
>>> 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