它是Euler项目#4的答案。
回文数字两种方式相同。由两个2位数字的乘积组成的最大回文是9009 = 91 99
。
找出由两个3位数字的乘积制成的最大回文。
答案:
906609
代码是:
from multiprocessing import Pool
from itertools import product
def sym(lst):
rst=[]
for x,y in lst:
tmp=x*y
if rec(tmp):
rst.append(tmp)
return rst
def rec(num):
num=str(num)
if num == "".join(reversed(num)): return True
else: return False
if __name__ == "__main__":
pool=Pool(processes=8)
lst=product(xrange(100,1000),repeat=2)
rst=pool.map(sym,lst)
#rst=sym(lst)
print max(rst)
当我运行时:
# TypeError:'int' object is not iterable
但是我无法理解它......不是列表可迭代的吗?或者我的代码中是否有错误?
答案 0 :(得分:4)
问题在于sym
功能。
sym
正在传递产品可迭代的第一个元素。 (例如lst = (100,100)
)。当你到达for
循环时,你正在迭代lst
,然后尝试将其解压缩为两个数字 - 相当于:
for x,y in (100,100):
...
由于显而易见的原因而失败了。
我想你可能想要摆脱for循环 - 这可能是你的串行版本的神器。
def sym(lst):
x,y=lst
tmp=x*y
if rec(tmp):
return tmp
else:
return None #max will ignore None values since None > x is always False.
回溯有点神秘 - 显然回溯会返回到Pool
然后重新提升......但是它的完成方式使得跟踪有点困难。
有时,在调试这些内容时,将Pool.map()
替换为map
的常规版本会很有帮助。然后,在您的主“线程”上引发任何引发的异常,并且回溯可以更容易理解。