我是python的新手,我的问题如下:
我定义了一个函数func(a,b)
,它返回一个给定两个输入值的值。
现在我将数据存储在列表或numpy数组A,B
中,并希望对每个组合使用func
。 (A和B有超过一百万条)
ATM我使用此代码段:
for p in A:
for k in B:
value = func(p,k)
这需要花费很多时间。
所以我想的可能是这样的:
C=(map(func,zip(A,B)))
但这种方法只能成对使用......有什么想法吗?
感谢您的帮助
答案 0 :(得分:3)
您需要为多对值计算f
的输出。加速这种循环(计算)的“标准”方法是使您的函数f
接受(NumPy)数组作为输入,并立即对整个数组进行计算(即,没有看到循环来自Python)。查看任何NumPy教程以获得介绍。
如果A
和B
各有超过一百万个条目,则有一万亿个组合。对于64位数字,这意味着您只需要7.3 TiB的空间来存储计算结果。你有足够的硬盘来存储结果吗?
如果A
和B
小得多,在您的特定情况下,您可以执行此操作:
values = f(*meshgrid(A, B))
meshgrid
返回A
和B
的笛卡尔积,因此它只是一种生成必须评估的点的方法。
您需要有效地使用NumPy来避免Python循环。 (或者,如果所有其他方法都失败或者无法轻易地进行矢量化,请使用编译语言编写这些循环,例如使用Cython)
使用太字节数据很难。你真的需要这么多数据吗?
任何在循环中调用函数f
1e12次的解决方案都必然会很慢,特别是在CPython中(这是默认的Python实现。如果你不确定而且你是使用NumPy,你也在使用它。)
答案 1 :(得分:1)
f
一万亿次将需要一段时间。
除非您有办法减少要计算的值的数量,否则您无法做到比以上更好。
答案 2 :(得分:1)
假设,itertools.product可以满足您的需求:
from itertools import product
pro = product(A,B)
C = map(lambda x: func(*x), pro)
只要它是生成器,它就不需要额外的内存
答案 3 :(得分:1)
如果你使用NumPy,你肯定应该看看为此类问题设计的np.vectorize
函数......