2014-07-04 32 views
0

我在寫一個Python腳本in Python 2.7其中我需要在一個範圍內生成大約500,000個統一的隨機數。我需要這樣做4次,對它們進行一些計算並寫出4個文件。python中的多重處理

目前我做的:(this is just part of my for loop, not the entire code)

random_RA = [] 
for i in xrange(500000): 
    random_RA.append(np.random.uniform(6.061,6.505)) # FINAL RANDOM RA 

random_dec = [] 
for i in xrange(500000): 
    random_dec.append(np.random.uniform(min(data_dec_1),max(data_dec_1))) # FINAL RANDOM 'dec' 

生成範圍內的隨機數。我正在運行Ubuntu 14.04當我運行程序時,我也打開我的系統管理器,看看我的8個CPU是如何工作的。我似乎注意到,當程序運行時,8個CPU中只有1個似乎以100%的效率工作。所以整個程序需要大約45分鐘才能完成。

我注意到,它可以使用所有的CPU我的優勢使用模塊Multiprocessing

我想知道這是不是足夠在我的例子:

random_RA = [] 
for i in xrange(500000): 
    multiprocessing.Process() 
    random_RA.append(np.random.uniform(6.061,6.505)) # FINAL RANDOM RA 

即加入只是線路multiprocessing.Process(),那就夠了嗎?

+0

有你甚至閱讀文件? https://docs.python.org/dev/library/multiprocessing.html –

+0

@AleksanderLidtke我讀過它,我認爲上述可能工作。但在嘗試之前,我想知道它是否會來自專家 – ThePredator

+1

回答你的問題:那肯定會**不夠。 – freakish

回答

0

爲了讓你開始:

import multiprocessing 
import random 

def worker(i): 
    random.uniform(1,100000) 
    print i,'done' 


if __name__ == "__main__": 
    for i in range(4): 
     t = multiprocessing.Process(target = worker, args=(i,)) 
     t.start() 
    print 'All the processes have been started.' 

您必須門t = multiprocess.Process(...)與​​爲每個工人稱這個程序(模塊)再次找出它有什麼做的。如果門沒有發生,它會產生更多的進程...

只是爲了完整性,生成500000個隨機數不會帶你45分鐘,所以我認爲這裏有一些密集計算:你可能想要密切關注他們。

1

如果使用多處理,應儘可能避免共享狀態(如random_RA列表)。 相反,嘗試使用Pool及其map方法:

from multiprocessing import Pool, cpu_count 

def generate_random_ra(x): 
    return np.random.uniform(6.061, 6.505) 

def generate_random_dec(x): 
    return np.random.uniform(min(data_dec_1), max(data_dec_1)) 

pool = Pool(cpu_count()) 
random_RA = pool.map(generate_random_ra, xrange(500000)) 
random_dec = pool.map(generate_random_dec, xrange(500000))