亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在python中向量化蒙特卡洛模擬

在python中向量化蒙特卡洛模擬

瀟瀟雨雨 2021-05-20 14:15:14
我最近一直在使用python編寫一些代碼,以使用蒙特卡洛方法模擬二維U(1)規范理論。本質上,我有一個n×n×2的unit復數數組(稱為鏈接)(其大小為1)。我隨機選擇我的Link數組的元素,并建議對該站點上的數字進行隨機更改。然后,我計算由于該更改而將發生的操作中的結果更改。然后,我接受概率為min(1,exp(-dS))的更改,其中dS是操作中的更改。迭代器的代碼如下def iteration(j1,B0):    global Link    Staple = np.zeros((2),dtype=complex)    for i0 in range(0,j1):        x1 = np.random.randint(0,n)        y1 = np.random.randint(0,n)        u1 = np.random.randint(0,1)        Linkrxp1 = np.roll(Link,-1, axis = 0)        Linkrxn1 = np.roll(Link, 1, axis = 0)        Linkrtp1 = np.roll(Link, -1, axis = 1)        Linkrtn1 = np.roll(Link, 1, axis = 1)        Linkrxp1tn1 = np.roll(np.roll(Link, -1, axis = 0),1, axis = 1)        Linkrxn1tp1 = np.roll(np.roll(Link, 1, axis = 0),-1, axis = 1)        Staple[0] = Linkrxp1[x1,y1,1]*Linkrtp1[x1,y1,0].conj()*Link[x1,y1,1].conj() + Linkrxp1tn1[x1,y1,1].conj()*Linkrtn1[x1,y1,0].conj()*Linkrtn1[x1,y1,1]        Staple[1] = Linkrtp1[x1,y1,0]*Linkrxp1[x1,y1,1].conj()*Link[x1,y1,0].conj() + Linkrxn1tp1[x1,y1,0].conj()*Linkrxn1[x1,y1,1].conj()*Linkrxn1[x1,y1,0]        uni = unitary()        Linkprop = uni*Link[x1,y1,u1]        dE3 = (Linkprop - Link[x1,y1,u1])*Staple[u1]        dE1 = B0*np.real(dE3)        d1 = np.random.binomial(1, np.minimum(np.exp(dE1),1))        d = np.random.uniform(low=0,high=1)        if d1 >= d:            Link[x1,y1,u1] = Linkprop        else:            Link[x1,y1,u1] = Link[x1,y1,u1]在程序開始時,我調用一個稱為“隨機化”的例程,以生成K個具有較小虛部的隨機unit復數,并將它們存儲在一個長度為K的Cnum數組中。在同一例程中,我還將遍歷Link數組并進行設置每個元素為一個隨機的complex復數。該代碼在下面列出。在迭代例程期間,使用以下例程來獲取具有較小虛部的隨機復數(通過檢索我們先前生成的Cnum數組的隨機元素)。我們需要先定義一些變量,然后再運行任何東西,所以這是我在定義任何例程之前定義的初始變量K = 20000n = 50a = 1.0Link = np.zeros((n,n,2),dtype = complex)Cnum = np.zeros((2*K), dtype = complex)這段代碼有效,但是速度很慢。有沒有一種方法可以使用多處理或其他方法來加快速度?
查看完整描述

1 回答

?
斯蒂芬大帝

TA貢獻1827條經驗 獲得超8個贊

您應該使用cython和c數據類型。另一個cython鏈接。它是為快速計算而構建的。

您可以在以下兩種情況之一中使用multiprocessing。如果您有一個需要多個進程共享的對象,則需要使用Manager(請參閱多處理鏈接),Lock和Array在進程之間共享該對象。但是,不能保證這樣做會提高速度,因為每個過程都需要鎖定鏈接以保證您的預測,假設預測受到鏈接中所有元素的影響(如果一個過程同時修改了另一個過程的一個元素)正在對元素進行預測,則該預測將不會基于最新信息。

如果您的預測未考慮其他元素的狀態,即它只關心一個元素,那么您可以將Link數組劃分為多個部分,然后將塊劃分為一個過程池中的多個過程,并在完成后合并分段回到一個數組。這當然可以節省時間,并且您不必使用任何其他的多處理機制。


查看完整回答
反對 回復 2021-05-25
  • 1 回答
  • 0 關注
  • 195 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號