簡體   English   中英

在多線程生產者-消費者范例中,Python顯式的next()比for循環慢

[英]Python explicit next() slower than a for loop in multithreaded producer-consumer paradigm

假設我有以下代碼運行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隊列中獲取數據。 更具體地說,在后台,一個單獨的線程將數據加載到Queue中,並且對next()每次調用都會從該Queue中產生一個對象。 如果省略了這種異步行為,則兩個代碼片段將花費相同的時間。

它們不相等。 具體來說,您的第一個片段調用一次get_next_img_batch() ,而您的第二個片段調用該函數10次。 等效片段可能是:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM