0
通过讨论Making a flat list out of list of lists in Python启发我试图将此转换(获取文件和文件夹的修改。在some_directory次):转换嵌套列表理解使用itertools链蟒蛇
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
谢谢 - 我也能避免连接列表通过像'itertools.chain一些可怕的事情.from_iterable([root],map(lambda fi:join(root,fi),files)] for root,d,files in os.walk(path)))' - 我觉得我在itertools符号中错过了一些东西 - 你能否重写我的示例,避免使用'for root,d,files ....'? –
是的,你可以使用一个额外的'chain'呼吁避免串联,但是这将是丑陋的。我不认为有'os.walk'输出使用'chain'的优雅方法。他们只是不能很好地融合在一起。当你想要'root'名字以及文件时,情况会更糟。 – Blckknght