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

Python explicit next()比多线程生产者-消费者范式中的for循环慢,python,multithreading,generator,Python,Multithreading,Generator,假设我有以下代码,它运行10次迭代并调用生成器gen\u next\u img\u 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)) 我遇到的难题是,

假设我有以下代码,它运行10次迭代并调用生成器
gen\u next\u img\u 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\u next\u img\u batch
从后台线程中不断填充的Python队列中获取数据。更具体地说,在后台,一个单独的线程正在向队列加载数据,每次调用
next()
都会从该队列中生成一个对象。当忽略此异步行为时,两个代码段占用相同的时间

它们不是等价的。具体来说,第一个片段调用一次
get\u next\u img\u batch()
,而第二个片段调用该函数10次。等效片段可能是:

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

谢谢你,我为这个小错误感到抱歉。但是,我可以问一下,为什么第二个代码片段的迭代时间会单调增加?这是否是由于并行运行的线程数量不断增加,系统由于CPU使用率高而表现出总体减速这一事实的结果?