это моя первая многопроцессорная реализация, я выполнил мой код в последовательном подходе, и мне потребовалась минута, чтобы обработать 30 секунд для обработки 20 записей. Но я создал словарь с каждым ключом, имеющим набор записей, и попытался применить эту функцию, используя pool.map для каждого ключа. Теперь для обработки требуется более 2 минут, хотя я рекомендую каждое ядро для каждого процесса. Может ли кто-нибудь помочь мне оптимизировать это.python - многопроцессорность медленнее, чем последовательная
def f(values):
data1 = itertools.combinations(values,2)
tuple_attr =('Age', 'Workclass', 'Fnlwgt', 'Education', 'Education-num', 'marital-status', 'Occupation', 'Relationship', 'Race', 'Sex', 'Capital-gain', 'Capital-loss', 'Hours-per-week', 'Native country', 'Probability', 'Id')
new = ((tuple_attr[i] for i, t in enumerate(zip(*pair)) if t[0]!=t[1]) for pair in data1)
skt = set(frozenset(temp) for temp in new)
newset = set(s for s in skt if not any(p < s for p in skt))
empty = frozenset(" ")
tr_x = set(frozenset(i) for i in empty)
tr = set(frozenset(i) for i in empty)
for e in newset:
tr.clear()
tr = tr.union(tr_x)
tr_x.clear()
for x in tr:
for a in e:
if x == empty:
tmp = frozenset(frozenset([a]))
tr_x = tr_x.union([tmp])
else :
tmp = frozenset(frozenset([a]).union(x))
tr_x = tr_x.union([tmp])
tr.clear()
tr = tr.union(tr_x)
tr = set(l for l in tr if not any(m < l for m in tr))
return tr
def main():
p = Pool(len(data)) #number of processes = number of CPUs
keys, values= zip(*data.items()) #ordered keys and values
processed_values= p.map(f, values)
result= dict(zip(keys, processed_values))
p.close() # no more tasks
p.join() # wrap up current tasks
print(result)
if __name__ == '__main__':
import csv
dicchunk = {*****} #my dictionary
main()
Попробуйте использовать более крупный набор данных? Это займет довольно много работы, прежде чем несколько потоков/процессов станут стоить накладных расходов на переключение контекста, форсирование и т. Д. –
Это один грязный код, вам действительно нужно работать с именами переменных. И что @Corey сказал, когда я печатал свой комментарий - большой набор данных. Но не слишком много, так как это будет довольно дорого в памяти. –
Можете ли вы предоставить образец данных? – dano