希望能够在这里获得一些帮助,并行化我的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