python - 在两个不同列表的元素之间计算重函数的最快方法
问题描述
正如标题中所写,我想知道是否有比我发现的更快的方法在两个列表的元素之间执行计算复杂的函数。
这里作为一个例子,我将采用阶乘,但该函数是一个发电机函数,用于检查两个元素之间是否存在交集。
这是我迄今为止能够做到的。谁能帮我?
%%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
解决方案
在原始问题中,创建了一个阶乘列表(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 的想法
推荐阅读
- python - 在 Mac OS Mojave 上使用 py2app 部署 Kivy 应用程序
- c - 霍夫曼树的想法。遍历树并返回 C 中的路径
- r - 根据单独的逻辑向量删除元素
- osgi - 在 karaf 中使用 cxf 时出错 java.lang.LinkageError
- android - 在列表视图中的文本旁边插入图像
- css - :hover 功能仅在 DIV 的选定内部部分上
- javascript - 使用模板字符串定义变量
- r - 想要在数据表中有一个包含图像的列;它适用于 URL,但不适用于本地路径
- c# - 是否可以在 WinNT 服务提供程序中使用 SID?
- pandas - 仅检测从正到负的值符号变化