我想要一种嵌套循环操作的快速替代方案,其中第二个循环在第一个循环中的某些操作之后发生。
例如:
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
答案 0 :(得分:0)
这里没有有意义的更快替代方法。内部循环的值取决于外部循环生成的值,因此无法使用itertools.product
进行微优化。
如果您实际上是在迭代目录(而不是描述目录的字符串中的字符),则强烈建议您在os.listdir
上使用os.scandir
(假设您使用的是许多人而没有知道前者的存在),因为在以下情况下它会更快:
使用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