首页 > 解决方案 > 在两个不同列表的元素之间计算重函数的最快方法

问题描述

正如标题中所写,我想知道是否有比我发现的更快的方法在两个列表的元素之间执行计算复杂的函数。

这里作为一个例子,我将采用阶乘,但该函数是一个发电机函数,用于检查两个元素之间是否存在交集。

这是我迄今为止能够做到的。谁能帮我?

%%time
import random
import itertools
import math
random.seed(10)

list1=[random.randint(1, 100) for i in range(10000)]
list2=[random.randint(1, 10) for i in range(100)]

two_lists=[list1,list2]
permutation = itertools.product(*two_lists) # I obtain the permutation ty Cyttorak
result=[math.factorial(x[0]+x[1]) for x in permutation] # The complex operation (factorial of the sum)
Wall time: 1.11 s

标签: pythonlist-comprehensionpermutationitertools

解决方案


在原始问题中,创建了一个阶乘列表(result),即使它显然没有被使用。此代码与该异常一致,通常在我的机器上以 ~0.11s 执行:-

import random
from math import factorial
from itertools import product
import time
from functools import lru_cache


@lru_cache(maxsize=110)
def facto(n):
    return factorial(n)


start = time.perf_counter()
list1 = [random.randint(1, 100) for i in range(10000)]
list2 = [random.randint(1, 10) for i in range(100)]
result = [facto(x) for x in map(sum, product(list1, list2))]
end = time.perf_counter()
print(end-start)

感谢 Michael Szczesny 提出使用 lru_cache 的想法


推荐阅读