【问题标题】:Python Iterators: What does iglob()'s Iterator provide over glob()'s list?Python 迭代器:iglob() 的迭代器在 glob() 的列表上提供了什么?
【发布时间】:2011-05-16 06:55:34
【问题描述】:

给定一段代码:

from glob import glob, iglob

for fn in glob('/*'):
    print fn

print ''

for fn in iglob('/*'):
    print fn

阅读 glob 的 documentation 我看到 glob() 返回文件的基本列表和 iglob 一个迭代器。但是,我可以对两者进行迭代,并且它们每个都返回相同的文件列表。

我已经阅读了Iterator 上的文档,但它并没有真正阐明这个主题!

那么返回 Iterator 的 iglob() 对 glob() 的列表有什么好处?我是否比我的老朋友获得了额外的功能?

【问题讨论】:

    标签: python iterator


    【解决方案1】:

    文档本身中提到了差异:

    返回一个迭代器,它产生与 glob() 相同的值,但实际上并没有同时存储它们。

    基本上列表将包含内存中的所有项目。迭代器不需要,因此它需要更少的内存。

    【讨论】:

    • 只需添加它称为“惰性评估”。除非我们不需要它,否则我们不会做某事。
    • 注意:对于单个目录,内存使用是相同的(由于当前通过os.listdir() 实现)。如果有多个目录包含许多文件,则优势就显现出来了。
    • 就像@JFSebastian 说的那样,iglob 相对于 glob 的速度/内存优势受到 os.listdir() 的阻碍(请参阅this ):这意味着它们都会比包含大量文件的目录慢.如果您有这个问题,请查看formic。示例here.
    • @LucaInvernizzi:我根本没有提到速度。 glob 也支持 **。似乎formic 使用os.walk 使用os.listdir()。对于您提供的链接,尚不清楚瓶颈在哪里是文件系统或 python。你可以尝试readdir() 甚至getdents() 在一个级别读取数百万个文件
    【解决方案2】:

    添加到amit's answer。 iglob() 在特定情况下很有用,如果您删除列表中的目录,则列表中的文件和文件夹将由 glob() 存储,因此循环中的进一步访问会引发异常。但是通过使用 iglob() 我们可以克服并发修改异常

    【讨论】:

    • 我没明白,请您详细说明一下。谢谢!
    • @Coddy,假设您要删除文件夹 test 中所有以“w”开头的目录和文件。 glob() 将所有目录和文件夹的路径存储在“test”中。假设“test”中有一个名为“willow”的文件夹,并且有文件“file1”、“file2”和“wfile3”。当您使用 glob() 并删除 'willow',然后尝试删除 'wfile3' 时,它会抛出异常。如果您使用 iglob() 文件和目录的路径将不会被预存储。所以,你甚至不会去 'wfile3;
    猜你喜欢
    • 1970-01-01
    • 2015-05-20
    • 2012-10-11
    • 2018-01-28
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多