繁体   English   中英

转换嵌套列表推导以在python中使用itertools链

[英]Convert nested list comprehension to use itertools chain in python

受到在Python列表列表之外制作平面列表中的讨论的启发,我尝试进行转换(在some_directory中获取文件和文件夹的修改时间):

c = [os.path.getmtime(item) for root, d, files in os.walk(some_directory)
        for item in [root] + map(lambda fi: os.path.join(root, fi), files)]

要使用itertools.chain:

c = map(os.path.getmtime,
        itertools.chain.from_iterable([root] + map(lambda fi: join(root, fi), files)
                                      for root, d, files in os.walk(some_directory)))

但我的剖析显示它速度较慢,而且看起来并不优雅。

因此,在这种情况下,如何使用链,也就是如何更好地(更快)生成中间列表?

还是我的情况下还有其他itertools函数?

编辑:

整理了一个分析脚本:

import timeit

repeat = 10

setup ="""
import itertools
import os

join = os.path.join
path = r'C:\Dropbox\eclipse_workspaces'
c = []
"""


print "Original             ", min(timeit.Timer("""[c.extend([join(root,dir) for dir in dirs] + [join(root,file) for file in files]) for root,dirs,files in os.walk(path)]""",
                       setup=setup).repeat(3, repeat))
print "For loop             ", min(timeit.Timer("""for root, d, files in os.walk(path):
    c.append(root)
    c.extend(join(root, fi) for fi in files)""",
                       setup=setup).repeat(3, repeat))
print "Comprehension        ", min(timeit.Timer('[item for r, d, f in os.walk(path) for item in [r] + map(lambda f: join(r, f), f)]',
                       setup=setup).repeat(3, repeat))
print "Comprehension + chain", min(timeit.Timer('[item for r, d, f in os.walk(path) for item in itertools.chain.from_iterable(([r], map(lambda fi: join(r, fi), f)))]',
                       setup=setup).repeat(3, repeat))
print "Itertools            ", min(timeit.Timer("""[j for j in itertools.chain.from_iterable([root] + map(lambda fi: join(root, fi), files)
                                      for root, d, files in os.walk(path))]""",
                       setup=setup).repeat(3, repeat))

似乎没有什么区别,但分析时我有一些奇怪的工件,因此我不发布任何结果。 我仍然对最快的方法感兴趣,最好使用itertools

我认为在这里使用chain没有意义。 当扁平化是要替换的理解的全部内容时, chain最有用。 如果您正在做更复杂的事情,那么坚持理解或生成器表达式可能会更容易。 甚至将结构解压缩到显式的for循环中,这可能使您避免在当前代码中使用列表串联之类的方法:

c = []
for root, d, files in os.walk(some_directory):
    c.append(root)
    c.extend(join(root, fi) for fi in files)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM