РЕДАКТИРОВАНИЕ:
Ага!
Код написан на Python 3, вдохновлен tyz:
from functools import reduce # only in Python 3
def process(old, num):
new = set(map(num.__add__, old)) # use itertools.imap for Python 2
new.update(map((-num).__add__, old))
return new
def pmv(nums):
n = iter(nums)
x = next(n)
result = {x, -x} # set([x, -x]) for Python 2
return reduce(process, n, result)
Вместо разделения на половину и рекурсии, я используюreduce
чтобы вычислить это один за другим.это значительно сократило время вызовов функций.
На вычисление 256 чисел уходит менее 1 секунды.
Почему продукт тогда mult?
def pmv(nums):
return {sum(i):i for i in itertools.product(*((num, -num) for num in nums))}
Может бытьбыстрее без того, как были получены цифры:
def pmv(nums):
return set(map(sum, itertools.product(*((num, -num) for num in nums))))