希望能夠在這裏獲得一些幫助,並行化我的python代碼,我一直在苦苦掙扎了一段時間,並以我嘗試的方式提出了幾個錯誤,目前正在運行的代碼將會涉及2-3小時完成,代碼如下:用於數值計算的多處理python函數
import numpy as np
from scipy.constants import Boltzmann, elementary_charge as kb, e
import multiprocessing
from functools import partial
Tc = 9.2
x = []
g= []
def Delta(T):
'''
Delta(T) takes a temperature as an input and calculates a
temperature dependent variable based on Tc which is defined as a
global parameter
'''
d0 = (pi/1.78)*kb*Tc
D0 = d0*(np.sqrt(1-(T**2/Tc**2)))
return D0
def element_in_sum(T, n, phi):
D = Delta(T)
matsubara_frequency = (np.pi * kb * T) * (2*n + 1)
factor_d = np.sqrt((D**2 * cos(phi/2)**2) + matsubara_frequency**2)
element = ((2 * D * np.cos(phi/2))/ factor_d) * np.arctan((D * np.sin(phi/2))/factor_d)
return element
def sum_elements(T, M, phi):
'''
sum_elements(T,M,phi) is the most computationally heavy part
of the calculations, the larger the M value the more accurate the
results are.
T: temperature
M: number of steps for matrix calculation the larger the more accurate the calculation
phi: The phase of the system can be between 0- pi
'''
X = list(np.arange(0,M,1))
Y = [element_in_sum(T, n, phi) for n in X]
return sum(Y)
def KO_1(M, T, phi):
Iko1Rn = (2 * np.pi * kb * T /e) * sum_elements(T, M, phi)
return Iko1Rn
def main():
for j in range(1, 92):
T = 0.1*j
for i in range(1, 314):
phi = 0.01*i
pool = multiprocessing.Pool()
result = pool.apply_async(KO_1,args=(26000, T, phi,))
g.append(result)
pool.close()
pool.join()
A = max(g);
x.append(A)
del g[:]
我的做法是試圖發送KO1功能成多池,但我要麼得到一個Pickling
錯誤或too many files open
,任何幫助是極大的讚賞,如果多是錯誤的做法我很樂意的任何指南。
代替多線程,我認爲你可以減少代碼的運行時間,但是使用正確的數組操作而不是循環,因爲你似乎涉及相當簡單的數學。 (如我錯了請糾正我)。此代碼看起來像是由C編程人員編寫的;) 檢查這些:http://technicaldiscovery.blogspot.de/2011/06/speeding-up-python-numpy-cython-and.html http:// scipy -cookbook.readthedocs.io/items/PerformancePython.html – dnalow
Iol我很受寵若驚:D @ dnalow,但遺憾的是這是由一位化學家成爲工程師的新手編寫的,我對使用網格方面感興趣Numpy,但我不太確定我會如何在這裏實現它。 – user3191569