Я - почти новый программист, изучающий python в течение нескольких месяцев. За последние 2 недели я был кодированием, чтобы сделать скрипт для поиска перестановок чисел, которые создают магические квадраты.Что случилось с моим кодом многопроцессорности python?
Наконец-то мне удалось найти целые 880 4x4 магических квадратных чисел в течение 30 секунд. После этого я сделал несколько разных программ Perimeter Magic Square. Он обнаруживает более 10 000 000 перестановок, так что я хочу, чтобы они частично их копировали в файлы. Проблема в том, что моя программа не использует все мои процессы, пока она работает для хранения некоторых частичных данных в файле, и прекращает поиск новых наборов чисел. Надеюсь, я смогу запустить один процесс моего процессора, а остальные хранят найденные данные в файлах.
Ниже приведена аналогичная структура моей магической квадратной программы.
while True:
print('How many digits do you want? (more than 20): ', end='')
ansr = input()
if ansr.isdigit() and int(ansr) > 20:
ansr = int(ansr)
break
else:
continue
fileNum = 0
itemCount = 0
def fileMaker():
global fileNum, itemCount
tempStr = ''
for i in permutationList:
itemCount += 1
tempStr += str(sum(i[:3])) + ' : ' + str(i) + ' : ' + str(itemCount) + '\n'
fileNum += 1
file = open('{0} Permutations {1:03}.txt'.format(ansr, fileNum), 'w')
file.write(tempStr)
file.close()
numList = [i for i in range(1, ansr+1)]
permutationList = []
itemCount = 0
def makePermutList(numList, ansr):
global permutationList
for i in numList:
numList1 = numList[:]
numList1.remove(i)
for ii in numList1:
numList2 = numList1[:]
numList2.remove(ii)
for iii in numList2:
numList3 = numList2[:]
numList3.remove(iii)
for iiii in numList3:
numList4 = numList3[:]
numList4.remove(iiii)
for v in numList4:
permutationList.append([i, ii, iii, iiii, v])
if len(permutationList) == 200000:
print(permutationList[-1])
fileMaker()
permutationList = []
fileMaker()
makePermutList(numList, ansr)
Я добавил from multiprocessing import Pool
наверху. И я заменил две части файла fileMaker() в конце следующим.
if __name__ == '__main__':
workers = Pool(processes=2)
workers.map(fileMaker,())
В результате? О нет. Это просто работает неловко. Пока многопроцессорность выглядит слишком сложной для меня.
Любой, пожалуйста, научите меня чему-то. Как изменить код?
Если есть особые проблемы, поставьте его здесь. Если кодовые слова и вы просто хотите улучшить его, перейдите к [codereview.se] –
Я предлагаю использовать несколько numpy или так, потому что многие многострочные петли являются катастрофой, когда дело доходит до времени вычислений – usethedeathstar
. Мой реальный программный код больше сложный, чем тот, что так много сложены для петель. Благодарю. – user2579484