2013-09-24 44 views
0

我有一個Python腳本,它從API收集10,000個'people',然後繼續請求其他兩個API來收集有關它們的更多數據,然後將信息保存到本地數據庫,每人約需0.9秒。我應該使用多線程嗎? (從API檢索海量數據)

所以目前需要很長時間才能完成。多線程是否有助於加快速度?我在本地嘗試了多線程測試,速度較慢,但​​這個測試只是一個簡單的函數,沒有任何API交互或任何與Web /磁盤相關的任何事情。

謝謝

+0

你在說什麼API? –

+0

假設API訪問遠程服務器或「慢」本地資源(如磁盤綁定數據庫),*和*假設您的客戶端本身具有備用資源,則併發可能是要走的路。 – Will

+0

您應該查看python GIL(全局解釋器鎖)。我還沒有測試過自己的性能,但我希望Python的腳本性能不會因增加更多的線程而有所提高。 I/O綁定線程將比計算綁定線程做得更好 - 所以如果你的腳本大部分是IO綁定的,那麼添加線程很可能會提高它的性能。對於計算綁定腳本,多處理將會更好 - 在幾個進程中運行腳本,每個腳本都在做一些工作。 – joeking

回答

0

你有多少核心?

該過程如何可並行化?

問題CPU綁定?

如果您有多個內核,並且它們可以並行化,那麼您很可能會獲得提速。多線程的開銷幾乎不是100%,除非實施得非常好,所以這是一個優點。另一方面,如果緩慢部分受到CPU限制,那麼查看C擴展或Cython可能會更有成效。這兩種方法有時可以提供100倍的加速比(有時更多,通常更少,這取決於代碼的數字),比起天真使用multiprocessing的2倍加速少得多。顯然,100倍加速只適用於翻譯後的代碼。

但是,嚴重的是,配置文件。有可能是低掛果,比任何這些都容易獲得。嘗試行分析器(例如,名爲line_profiler [也稱爲kernprof])和內置cProfile。

+0

4核。 我不明白它是如何被限制的,已經有檢查來防止重複收集。 CPU負載非常低,我認爲主要的等待時間是外部API – questiontime1

+0

然後,您應該並行化API調用,哪些基本線程(參見'線程'或更新'concurrent.futures')將更容易處理。如果你沒有CPU綁定,多進程沒有任何意義。 – Veedrac

+0

我認爲整個任務確實需要進行線程化處理,因爲「人員」是較高級別類別的一部分。它們被檢索後,大約有200萬個類別。 – questiontime1

相關問題