import time
import multiprocessing
def do_something() 。
print("sleep 1 second"/span>)
time.sleep(1)
print("Done sleeping...")
if __name__ =='__main__'/span>:
start = time.perf_counter()
行程 = []
for _ in range(10)。
p = multiprocessing.Process(target=do_something)
p.start()
processes.append(p)
for process in processes:
process.join()
finish = time.perf_counter()
print(f'Finished in {round(finish-start, 2)} second(s)' /span>)
以上是我的代碼,我想做的是進行多行程處理,問題是我的代碼最終運行了1.22秒,而youtube上的人只用了1.02秒!我使用的是pycharm() 我使用pycharm(python 3.9),我檢查了我的任務管理器,當我運行這段代碼時,我的cpu利用率沒有達到最高,我的記憶體也是如此。是不是因為我用的是筆記本而不是臺式機?我的計算機硬體是否影響了速度?這0.2秒對我來說意義重大,因為我正在做一個專案,一秒鐘的時間都很重要。
還是因為我使用了if __name__ =='__main__':,但問題是如果我不使用這一行,我的代碼根本就不會運行,但視頻中的那個人不使用這一行也能運行他的代碼(我檢查了一下,我沒有打開任何其他檔案,我唯一有的檔案是main.py,如上所示。我個人認為這不會影響速度,但如果它影響了,請告訴我。
我所說的youtube視頻是Corey Schafer的《Python多處理教程》。使用多處理模塊并行運行代碼"
視頻。Python 多處理教程。使用多處理模塊并行運行代碼你可以在14:09看到,他只用了1.02秒就完成了代碼的運行
。uj5u.com熱心網友回復:
當然,硬體對運行時間很重要,特別是在使用多程式時。這取決于內核的數量、超執行緒的可能性、CPU的頻率和記憶體。
uj5u.com熱心網友回復:
if __name__ == "__main__"需要催生像Windows這樣的作業系統,而不是像linux這樣的分叉系統。Windows運行新的Process會慢一點,因為它需要執行一個新的Python,并從呼叫行程中提取/解壓環境,而linux只是分叉,對記憶體的看法不同。我并不感到驚訝,因為這是你額外的0.2秒。請注意,這只是一次性的,所以如果你的行程有很多作業要做,也沒什么大不了的。
盡管行程的數量通常很重要,但由于唯一的作業是sleep(1),你需要做很多行程才有意義。
我不知道pycharm是否與此有關。這值得在你的命令列上測驗一下。
我在我的 linux 筆記本電腦上運行的時間是 1.01 秒。當我像在Windows上那樣強制使用 "spawn "模式時,速度上升到了1.11秒。所以,對我來說,spawn的開銷是0.1秒。
更新
考慮到行程是以串行方式創建的,而這正是花費額外時間的地方,我嘗試用行程內執行緒來并行化這部分操作。首先,我嘗試了一個執行緒池,但那太慢了,但只要有一個執行緒創建行程,就能使代碼在一秒鐘內加速運行,從而消除了0.1秒(在你的例子中是0.2秒)的缺點。
import time
import multiprocessing
import執行緒
def do_something()。
print("sleep 1 second"/span>)
time.sleep(1)
print("Done sleeping...")
def run_do_something()。
p = multiprocessing.Process(target=do_something)
p.start()
processes.append(p)
if __name__ =='__main__'/span>:
multiprocessing.set_start_method('spwn')
start = time.perf_counter()
執行緒 = []
行程 = []
for _ in range(10)。
t = threading.Thread(target=do_something)
t.start()
threads.append(t)
for thread in threads:
thread.join()
for processes in processes:
process.join()
finish = time.perf_counter()
print(f'Finished in {round(finish-start, 2)} second(s)' /span>)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/316542.html
標籤:
下一篇:如何重定向幾乎相似的鏈接?
