2017-10-05 40 views
0

考慮以下情況中的元素:識別不同進程返回

class A: 
    def __init__(self): 
     self.b_list = [] 

    def add_element(b) 
     self.b_list.append(b) 

class B: 
    def __init__(self,x): 
     self.x = x 

class C: 
    def __init__(self,a,other_data): 
     self.a = a 
    def find_new_b(self): 
     .... 


def solve(c): 
    return c.find_new_b() 

class A每個實例有class B情況下,即以增量的方式添加的列表。

我需要遍歷class A的所有實例,併爲其中的每個實例找到一個新元素class B

我使用multiprocessing

list_of_c_elements = [...] 
pool = multiprocessing.Pool() 
results = pool.map(solve, list_of_c_elements) 

問題

在結果我有一個結果列表,我想了解哪些class A的新實例實例class B屬於。 class B的每個實例都是通用的,我想保持兩個類的解耦。

考慮解決方案

更改solve()到:

def solve(c): 
    return (c.a, c.find_new_b()) 

我要的class A我有一個返回(效率很低)的所有元素進行比較。 我不能這樣做:

for output in results: 
    output[0].add_element(output[1]) 

因爲返回的class A實例是另一個實例。

有沒有更高效的方法來實現我的目標?

+0

對於第二個考慮的解決方案,你是什麼意思,你不能使用它「因爲返回的類型A的對象是另一個對象」? – martineau

+0

在一次迭代中,我可以多次調用與A類型相同的對象的解決方案,並獲得同一對象的超過2個結果。因此,對結果中的每個元素使用返回的輸出[0]並執行output [0] .add_b_element(輸出[1])將添加到2個不同的A類型對象。 – newbie

+0

所以,你說'list_of_c_elements'可以有重複的'C'實例嗎?似乎是這樣 - 避免兩次添加一個b元素 - 無論你做什麼都會成爲問題。注意類'A'沒有名爲'add_b_element()'的方法。 – martineau

回答

1

C可以另外在成員中保存id(a),並且如果需要可以生成索引字典{id(a): a}。請注意,id()的所有調用當然必須在主要過程中發生,以產生可用的結果。