Я пытаюсь решить Problem 8 в проекте euler с многопоточной техникой в python.Многопоточность в python с петлей
Найти наибольший продукт из пяти последовательных цифр в 1000-значном номере. Номер можно найти here.
Мой подход состоит в том, чтобы сгенерировать продукт из кусков 5 из исходного списка и повторить этот процесс 5 раз, каждый с начальным индексом, сдвинутым вправо.
Вот мой класс резьбы
class pThread(threading.Thread):
def __init__(self, l):
threading.Thread.__init__(self)
self.l = l
self.p = 0
def run(self):
def greatest_product(l):
"""
Divide the list into chunks of 5 and find the greatest product
"""
def product(seq):
return reduce(lambda x,y : x*y, seq)
def chunk_product(l, n=5):
for i in range(0, len(l), n):
yield product(l[i:i+n])
result = 0
for p in chunk_product(num):
result = result > p and result or p
return result
self.p = greatest_product(self.l)
Когда я пытаюсь создать 5 потоков для покрытия всех 5-значных куски в моем первоначальном списке, ручной подход ниже дает правильный ответ, с num
быть список однозначных чисел, которые я анализирую из текста:
thread1 = pThread(num)
del num[0]
thread2 = pThread(num)
del num[0]
thread3 = pThread(num)
del num[0]
thread4 = pThread(num)
del num[0]
thread5 = pThread(num)
thread1.start()
thread2.start()
thread3.start()
thread4.start()
thread5.start()
thread1.join()
thread2.join()
thread3.join()
thread4.join()
thread5.join()
def max(*args):
result = 0
for i in args:
result = i > result and i or result
return result
print max(thread1.p, thread2.p, thread3.p, thread4.p, thread5.p)
Но это не дает правильный результат:
threads = []
for i in range(0, 4):
tmp = num[:]
del tmp[0:i+1]
thread = pThread(tmp)
thread.start()
threads.append(thread)
for i in range(0, 4):
threads[i].join()
Что я сделал не так? Я очень новичок в многопоточности, поэтому, пожалуйста, будьте осторожны.
Советы: переписать код без использования дель, это будет гораздо легче понять, почему он не работает, и почему исходный код также не является правильным. Кроме того, учитывая GIL, этот код вряд ли будет запускаться быстрее, чем однопоточная версия. –
Я переписал код без del, и да, он разрывает обе версии. Я изучу его позже позже. Благодарим за ваше предложение. –
резьба это серьезно overkill. вы можете сделать это в 1 строке с помощью max (уменьшить (op.mul, n_list [i: i + 5]) для i в xrange (1000)) ' – wim