0

私のメインコードの例である次のコードではpathos.multiprocessing、ループの反復速度を上げるために使用しようとしました。マルチプロセッシングで実装された各反復の出力は2-D 配列です。クラスメソッドで使用したかったので、pathos.multiprocessing代わりに使用しました。のメソッドを使用して出力をリストに収集しましたが、空のリストが返されます。失敗する理由がわからないmultiprocessingapipepathos.multiprocessing

import numpy as np
import random
import pathos.multiprocessing as mp
class Testsystematics(object):
      def __init__(self, x, y, NTH = None, THMIN = None, THMAX = None, NRESAMPLE = None):
         self.x        = x
         self.y        = y
         self.nbins    = NTH
         self.bmin     = THMIN
         self.bmax     = THMAX
         self.nresample= NRESAMPLE
         self.bins     = np.linspace(self.bmin, self.bmax, self.nbins+1, True).astype(np.float)
         self.sample   = np.array([[random.choice(range(len(self.y))) for _ in xrange(len(self.y))] for i in range(self.nresample)])
         self.result_list=[]
      def log_result(self, result):
          self.result_list.append(result)
      def bootstrapping(self, k):
          xi_p     = np.zeros(self.nbins, float)
          xi_m     = np.zeros(self.nbins, float)
          nind     = np.zeros(self.nbins, float)
          for i in range(len(self.x)):
              for j in range(len(self.x)):
                  if (i!=j): 
                     sep= np.sqrt(self.x[i]**2+self.x[j]**2)
                     index= np.searchsorted(self.bins, sep , side='right')-1 
                     sind = np.sin(sep)
                     if ((sep< self.bins[-1]) and (sep>=self.bins[0])):
                        xi_p[index] += sind*(np.mean(y)-np.median(y))
                        xi_m[index] += sind*np.std(y)
                        nind[index] += 1.0
          for i in range(self.nbins):
              xi_p[i]=xi_p[i]/nind[i]
              xi_m[i]=xi_m[i]/nind[i]
          return np.vstack((xi_p,xi_m))
      def twopcf(self):   
         if (self.sys_type==1):
            pool = mp.ProcessingPool(16)
            for n in range(self.nresample):
                pool.apipe(self.bootstrapping, args=(n,), callback=self.log_result)

shape,scale=0.5, 0.6
x=np.random.gamma(shape, scale, 10000)
mu1, sigma1 = 0, 0.5 # mean and standard deviation
mu2, sigma2 = 0.1, 0.7 # mean and standard deviation

y = np.random.normal(mu1, sigma1, 1000)+np.random.normal(mu2, sigma2, 1000)
sysTest=Testsystematics(x, y, NTH = 10, THMIN = 0, THMAX = 5, NRESAMPLE = 100)

なにか提案を?

4

1 に答える 1

0

私はpathos著者です。私はあなたのコードを試してみましたが、実行されますが、エラーは発生せず、result_list. apipe間違った使い方をしているからだと思います。の正しい使い方は次のapipeとおりです。

>>> import pathos
>>> def squared(x):
...   return x**2
... 
>>> pool = pathos.multiprocessing.ProcessingPool()
>>> res = pool.apipe(squared, 5)
>>> res.get()
25

self.bootstrappingselfとを取るので、インスタンスメソッドとして呼び出すときは、パイプ呼び出しでkを提供する必要があります。kコールバックがcallback必要な場合は、関数に追加する必要があります。

戻り値は、(1) 戻りオブジェクトを取得すること、および (2)get戻りオブジェクトを呼び出すことによって取得されることに注意してください。

apipeループ内でof を使用していることから、代わりに(or )forを使用することをお勧めします。その後、 for ループを並列で実行できます。pool.amappool.imap

于 2015-07-28T17:49:56.480 に答える