1

私は、Pythonを数か月学習しているほぼ新しいプログラマーです。この 2 週間、私は、魔方陣を構成する数字の順列を検索するスクリプトを作成するためのコーディングを行っていました。

最終的に、880 個の 4x4 の魔方陣セット全体を 30 秒以内に検索することに成功しました。その後、別の境界魔方陣プログラムを作成しました。10,000,000 以上の順列を見つけ出すので、それらをパーツごとにファイルに保存したいと考えています。問題は、プログラムがすべてのプロセスを使用していないことです。一部のデータをファイルに保存する作業中に、新しい数値セットの検索が停止します。CPU の 1 つのプロセスが検索を継続し、他のプロセスが検索されたデータをファイルに保存できるようにしたいと考えています。

以下は、私の魔方陣プログラムと同様の構造です。

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しました。そして、末尾の 2 つの「fileMaker()」部分を次のように置き換えました。

if __name__ == '__main__':
    workers = Pool(processes=2)
    workers.map(fileMaker, ())

結果?大野。ぎこちなく動作します。今のところ、マルチプロセッシングは私には難しすぎるようです。

どなたか、教えてください。コードをどのように変更すればよいですか?

4

1 に答える 1