4

如果列出目录并读取其中的文件,与返回目录中所有文件的列表相比,yield 的性能在什么时候开始恶化?

在这里,我假设一个有足够的 RAM 来返回(可能很大)列表。

PS 我在注释中内联代码时遇到问题,所以我会在这里放一些例子。

def list_dirs_list():
    # list version
    return glob.glob(/some/path/*)

def list_dirs_iter():
    # iterator version
    return glob.iglob(/some/path/*)

在幕后,对 glob 的两个调用都使用 os.listdir ,所以看起来它们在性能方面是等效的。但是这个 Python 文档似乎暗示 glob.iglob 更快。

4

4 回答 4

5

进一步使用不会yield导致性能下降。实际上,与将事物组合在列表中相比,yield实际上通过比较有更多的元素来改进。

于 2010-02-24T23:56:03.320 回答
2

这取决于您如何进行目录列表。Python 中的大多数机制将整个目录列表拉到一个列表中;如果这样做,那么即使是单一的产量也是一种浪费。如果使用opendir(3)那么它可能是一个随机数,根据 XKCD 对“随机”的定义。

于 2010-02-24T23:51:58.760 回答
1

使用 yield 在功能上类似于编写仿函数类,即使从实现或性能的角度来看也是如此,除了它实际上可能比__call__自制类上的方法调用生成器快一点,因为它内置在生成器的C 实现。

要锤这个家,下面的使用和粗略实现是一样的:

def generator_counter():
    i = 0
    while True:
        i += 1
        yield i

class functor_counter():
    def __init__(self):
        self.i = 0
    def __call__(self):
        i += 1
        return i
于 2010-02-25T01:09:18.123 回答
0

在 Python 2.7 中, 的定义glob

def glob(pathname): return list(iglob(pathname))

所以至少对于这个版本,glob永远不会比iglob.

于 2011-05-22T17:14:15.723 回答