Python処理の高速化

昨日の頭の体操は現在もCore2 Q6600で黙々と処理をしていて、10^617まできましたが、相変わらず12回のパターンはみつかりません。(たぶん、ないのだと思う)

それはさておき concurrent.futures を使用して、複数CPUコアで処理を高速化してみました。他にもちまちまと高速化の工夫を入れました。結果、Core i5-3570K(定格動作)で180桁まで5分かかったのが1分17秒と4倍近く早くなりました。(その過程で、4回のパターンをうまく抽出的できなくなったので誤魔化してあります^^;)

import datetime
import concurrent.futures

keta2 = [2,3,4,5,6,34,35]

def check(n):	# 引数の数値が何回かチェックする
	k = 1	# ループした回数を保持
	t = n	# 検査する対象をセット
	while True:
		u = 1
		for i in list(map(int,list(str(t)))) :
			u = u * i
		if u < 10 :
			break
		t = u
		k += 1
	return(k)

def kensho(keta):	# その桁数の数値の検証を行う
	maxk = 1		# 桁数を保持
	maxn = None		# 数値を保持
	now = datetime.datetime.now()
	print("keta: ",keta," / time: ",now-start)
	keta789 = keta - 2	# 
	for s1s2 in ['7'*i+'8'*j+'9'*(keta789-j-i) for i in range(0,keta789+1) for j in range(0,keta789-i+1)] :
		for k in keta2:	# 23456で構成される数値
			s3=str(k)
			n = int(s3+s1s2)
			r = check(n)
			if r > maxk :
				maxk = r
				maxn = n
	# print(keta,maxk,maxn)
	return(keta,maxk,maxn)

if __name__ == "__main__":
	maxk = 1		# 桁数を保持
	maxn = None		# 数値を保持	
	start = datetime.datetime.now()
	print('start: ',start)
	n = 2
	maxlist = {}
	while True:
		kl = range(n,n+50)
		n += 50
		with concurrent.futures.ProcessPoolExecutor(max_workers=4) as excuter:
			result_list = list(excuter.map(kensho,kl))
		# print(result_list)
		for k,mk,mn in result_list:
			if mk not in maxlist:
				maxlist[mk] = mn
			elif maxlist[mk] > mn :
				maxlist[mk] = mn
		print("result")
		for i in sorted(maxlist.keys()):
			if i>4 : print(i,maxlist[i])

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)