2013-07-15 5 views
1

Я - почти новый программист, изучающий 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,()) 

В результате? О нет. Это просто работает неловко. Пока многопроцессорность выглядит слишком сложной для меня.

Любой, пожалуйста, научите меня чему-то. Как изменить код?

+0

Если есть особые проблемы, поставьте его здесь. Если кодовые слова и вы просто хотите улучшить его, перейдите к [codereview.se] –

+0

Я предлагаю использовать несколько numpy или так, потому что многие многострочные петли являются катастрофой, когда дело доходит до времени вычислений – usethedeathstar

+0

. Мой реальный программный код больше сложный, чем тот, что так много сложены для петель. Благодарю. – user2579484

ответ

1

Ну, обращаясь к некоторым вещам, которые прослушивают меня, прежде чем попасть на заданный вами вопрос.

numList = [i for i in range(1, ansr+1)] 

Я знаю списочное это круты, но пожалуйста, просто list(range(1, ansr+1)) если вам нужна итерация быть список (который вы, вероятно, не нужен, но я отвлекся).

def makePermutList(numList, ansr): 
... 

Это довольно взломанный. Есть ли причина, по которой вы не можете использовать itertools.permutations(numList,n)? Это, безусловно, будет быстрее и удобнее в памяти.

Наконец, отвечая на ваш вопрос: если вы хотите улучшить производительность ввода/вывода, последнее, что вам нужно сделать, это сделать его многопоточным. Я не хочу, чтобы вы этого не делали, я имею в виду, что это должно быть буквально последним, что вы делаете. Рефакторинг/сначала улучшить другие вещи.

Вам нужно взять весь этот код верхнего уровня, который использует глобальные переменные, применить к нему ключ backspace и переписать функции, которые правильно передают данные. Тогда вы можете подумать об использовании потоков. Я лично использовал бы from threading import Thread и вручную создавал потоки для каждой единицы ввода-вывода, а не для многопроцессорности.

+0

Большое спасибо. Тем не менее я не могу понять, почему использование нескольких процессов хуже, чем одно. Но я изучу резьбу. – user2579484

Смежные вопросы