Python 显式 next() 比多线程生产者-消费者范式中的 for 循环慢



>假设我有以下代码运行 10 次迭代并调用生成器gen_next_img_batch

for _ in get_next_img_batch(train_data_paths, classes, batch_size):
pass

现在,假设我将其替换为以下等效的(在我看来(迭代:

for i in range(10):
next(get_next_img_batch(train_data_paths, classes, batch_size))

我遇到的难题是第一个片段需要 17 秒,而第二个片段需要 42 秒。此外,第二个代码段的每次迭代都比上一次迭代花费更多的时间。也就是说,第二个代码段的迭代 i+1 比迭代 i 花费的时间更长。第一个代码段的所有迭代都花费相同的时间。

一个重要的事实似乎是,迭代的生成器gen_next_img_batch从后台线程中不断填充的 Python 队列中获取数据。更具体地说,在后台,一个单独的线程将数据加载到队列,每次调用next()都会从该队列中生成一个对象。省略此异步行为时,两个代码段花费相同的时间。

它们不等效。具体来说,您的第一个片段调用get_next_img_batch()一次,而您的第二个片段调用该函数 10 次。等效片段可能是:

it = get_next_img_batch(train_data_paths, classes, batch_size))
for i in range(10):
next(it)

最新更新