[英]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.