2

我是 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)))

但是这种方法只能成对工作......有什么想法吗?

感谢帮助

4

4 回答 4

3

首要问题

您需要计算f多对值的输出。加速这种循环(计算)的“标准”方法是让您的函数f接受(NumPy)数组作为输入,并立即对整个数组进行计算(即,从 Python 中看没有循环)。查看任何 NumPy 教程以获取介绍。

第二期

如果每个条目A都有B超过一百万个条目,那么就有一万亿个组合。对于 64 位数字,这意味着您需要 7.3 TiB 的空间来存储计算结果。你有足够的硬盘来存储结果吗?

第三期

如果AB在哪里更小,在您的特定情况下,您可以这样做:

values = f(*meshgrid(A, B))

meshgrid返回 和 的笛卡尔积AB因此它只是一种生成必须评估的点的方法。

概括

  • 您需要有效地使用 NumPy 以避免 Python 循环。(或者,如果所有其他方法都失败了或者它们不容易被矢量化,那么用编译语言编写这些循环,例如使用Cython

  • 处理 TB 的数据非常困难。你真的需要那么多数据吗?

  • 任何在循环中调用函数f1e12 次的解决方案都会很慢,特别是在 CPython 中(这是默认的 Python 实现。如果您不确定并且正在使用 NumPy,那么您也在使用它)。

于 2012-10-30T16:21:04.527 回答
1

一百万乘以一百万就是一万亿。调用f一万亿次需要一段时间。

除非你有办法减少要计算的值的数量,否则你不能比上面做得更好。

于 2012-10-30T16:05:02.580 回答
1

假设, itertools.product 做你需要的:

from itertools import product

pro = product(A,B)
C = map(lambda x: func(*x), pro)

就它是生成器而言,它不需要额外的内存

于 2012-10-30T16:08:56.830 回答
1

如果你使用 NumPy,你绝对应该看看np.vectorize专为这类问题设计的功能......

于 2012-10-30T16:11:34.613 回答