python中嵌套循环操作的替代方法?

时间:2019-04-12 02:41:27

标签: python

我想要一种嵌套循环操作的快速替代方案,其中第二个循环在第一个循环中的某些操作之后发生。

例如:

date = target_date_list = pd.date_range(start=start_date, end=end_date).strftime(f'year=%Y/month=%m/day=%d')

for date in target_date_list:
    folder = f'path_to_folder/{date}'
    for file in folder:
        //some operation

2 个答案:

答案 0 :(得分:0)

这里没有有意义的更快替代方法。内部循环的值取决于外部循环生成的值,因此无法使用itertools.product进行微优化。

如果您实际上是在迭代目录(而不是描述目录的字符串中的字符),则强烈建议您在os.listdir上使用os.scandir(假设您使用的是许多人而没有知道前者的存在),因为在以下情况下它会更快:

  1. 您正在大型目录上操作
  2. 您要基于统计信息(特别是条目类型,这些内容是免费提供的,完全没有统计信息)来过滤内容

使用os.scandir和先前实现的内部循环:

for file in os.listdir(dir):
    path = os.path.join(dir, file)
    if file.endswith('.txt') and os.path.isfile(path) and os.path.getsize(path) > 4096:
        # do stuff with 4+KB file described by "path"

可以更改为:

with os.scandir(dir) as direntries:
    for entry in direntries:
        if entry.name.endswith('.txt') and entry.is_file() and entry.stat().st_size >= 4096:
        # do stuff with 4+KB file described by "entry.path"

但从根本上讲,此优化与避免嵌套循环无关。如果要迭代所有文件,则必须迭代所有文件。即使您将嵌套循环隐藏在实用程序方法后面,嵌套循环也将需要以某种方式发生,并且相对于文件系统访问的成本而言,其成本是没有意义的。

答案 1 :(得分:-2)

根据经验,在for循环中获得更好性能的最佳选择是使用生成器表达式。但是,我怀疑您的特定示例的性能提升会很小,因为您的外循环只是将变量分配给字符串的琐碎任务。

date = target_date_list = pd.date_range(start=start_date, end=end_date).strftime(f'year=%Y/month=%m/day=%d')

for file in (f'path_to_folder/{date}' for date in target_date_list):
    //some operation