我可以将其并行化吗?

时间:2012-06-21 03:04:29

标签: python

它是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

但是我无法理解它......不是列表可迭代的吗?或者我的代码中是否有错误?

1 个答案:

答案 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的常规版本会很有帮助。然后,在您的主“线程”上引发任何引发的异常,并且回溯可以更容易理解。