2017-06-07 93 views
1

我使用Ubuntu 17.04有處理器英特爾睿™i7-7500U CPU @ 2.70GHz×4的64位和16GB的RAM。
所以當我運行這個程序時,它使用一個單獨的內核而不是所有的4個內核。爲什麼Python的嘗試來計算多一些計算預先

import time 
import multiprocessing 

def boom1(*args): 
    print(5**10000000000) 

def boom2(*args): 
    print(5**10000000000) 

def boom3(*args): 
    print(5**10000000000) 

def boom4(*args): 
    print(5**10000000000) 

if __name__=="__main__": 
    array = [] 
    p1 = multiprocessing.Process(target=boom1, args=(array,)) 
    p2 = multiprocessing.Process(target=boom2, args=(array,)) 
    p3 = multiprocessing.Process(target=boom3, args=(array,)) 
    p4 = multiprocessing.Process(target=boom4, args=(array,)) 

    p1.start() 
    p2.start() 
    p3.start() 
    p4.start() 


    p1.join() 
    p2.join() 
    p3.join() 
    p4.join() 

    print('Done') 

現在,如果我在每個功能打印的10一些低功率:

print(5 ** 10000000) 

現在對於小的時間持續時間,單核正在處理100%,然後將所有4個核正在執行100% 。 這是爲什麼呢?它不應該從所有內核執行100%開始。

我漸漸知道的是,蟒蛇本身之前執行一些操作,因此在做,從一個單一的核心。如果是這樣的話,python是一種解釋型語言,還是我錯過了什麼?

回答

1

窺視片優化器試圖不斷摺疊5**10000000000計算。這發生在任何工作流程啓動之前。

1

大多數語言具有恆定的摺疊優化:當出現常數之間的操作,編譯器將執行該操作,並與單恆定結果替換表達式。

Python做這個,也是如此。我期望您的多節點操作只是每個節點上的開始打印連接的順序。

如果你想要得到的四個節點上不再運行,儘量不能在分析時計算的表達式。例如,在參數列表中傳遞基數並使用它來代替5,或者讓每個進程在1-10範圍內選擇一個隨機數並將其添加到指數中。這應該強制運行時評估。

0

我相信以前的答案是正確的,但可能無法完全解釋你的觀察。正如其他人所指出的那樣,您看到的單處理器時間是解釋器花費在計算指數表達式值的時間。因爲你使用的是整數,而且Python可以做任意長整數,所以這需要很長時間,可能是指數中0的指數。在第一種情況下,計算時間很長,看起來沒有超越(我不知道你是否跑完了,或者如果你的機器甚至可以在內存不足的情況下運行)。

在第二種情況下,您已經移除了足夠多的零以便它可以計算它(單線程解釋器),然後繼續打印(並行)。不管多長時間,第一起案件可能至少需要延長1000倍。