您原始的itertool代码在不必要的代码上花费了很多额外的时间
lambda,并手动建立了中间值列表-其中很多都可以用内置功能代替。
现在,内部的for循环确实增加了很多额外的开销:只需尝试以下操作,其性能与原始代码相当:
for a in itertools.product(carbons,hydrogens,nitrogens,oxygens17, oxygens18,sulfurs33,sulfurs34,sulfurs36): i, j, k, l, m, n, o, p = a totals.append((i[0]+j[0]+k[0]+l[0]+m[0]+n[0]+o[0]+p[0], i[1]*j[1]*k[1]*l[1]*m[1]*n[1]*o[1]*p[1]))
以下代码尽可能在CPython内置端运行,并且我对其进行了测试,使其等效于代码。值得注意的是,该代码用于
zip(*iterable)解压缩每个产品结果。然后将
reducewith
operator.mul用于乘积和
sum求和;2个用于查看列表的生成器。for循环仍然略胜一筹,但是从长远来看,可能很难对其进行硬编码了。
import itertoolsfrom operator import mulfrom functools import partialprod = partial(reduce, mul)elems = carbons, hydrogens, nitrogens, oxygens17, oxygens18, sulfurs33, sulfurs34, sulfurs36p = itertools.product(*elems)totals = [ ( sum(massdiffs), prod(chances) ) for massdiffs, chances in ( zip(*i) for i in p )]



