【问题标题】:Most elegant/efficient/Pythonic way to calculate multiple parallel arrays?计算多个并行数组的最优雅/高效/Pythonic 方式?
【发布时间】:2015-03-29 10:28:07
【问题描述】:

一些计量经济学工作。

在给定(可能)大量并行数据数组的情况下,我经常需要导出多个计算变量的并行数组。

在下面的示例中,我有两个输入数组和两个输出数组,但想象一下在现实世界中可能有 5-10 个输入和输出数组。

w, x 是输入
y, z 是输出

方法一:

w = [1, -2, 5]
x = [0, 3, 2]
N = len(w)
I = range(N)
y = map(lambda i: w[i] + x[i], I)
z = map(lambda i: w[i] - x[i], I)

方法B:

w = [1, -2, 5]
x = [0, 3, 2]
N = len(w)
I = range(N)
y, z = [], []
for i in I:
  y.append(w[i] + x[i])
  z.append(w[i] - x[i])

方法C:

w = [1, -2, 5]
x = [0, 3, 2]
y, z = [], []
for w_i, x_i in zip(w, x):
  y.append(w_i + x_i)
  z.append(w_i - x_i)

方法D:

w = [1, -2, 5]
x = [0, 3, 2]
N = len(w)
I = range(N)
(y, z) = transpose(map(lambda i: [w[i] + x[i], w[i] - x[i]], I))

D 似乎是最简洁、可扩展和高效的。但它也是最难阅读的,尤其是有许多具有复杂公式的变量。

A 是我最喜欢的,有一点重复,但是为每个变量构建一个循环效率会降低吗?这不会随着大数据而扩展吗?

B vs. C:我知道 C 更符合 Python 风格,但 B 似乎更方便、更简洁,并且可以通过更多变量更好地扩展。在这两种情况下,我都讨厌我必须预先声明变量的额外行。

总的来说,我对上述任何一种方法都不完全满意。我的推理中是否缺少某些东西,还是有更好的方法?

【问题讨论】:

  • 你考虑过使用numpy吗? Python 中的大多数科学计算都是在 numpy 中完成的。在 numpy 中,这只是y = w + x; z = w - x
  • @senshin,为什么不y, z = w + x, w - x
  • @PadraicCunningham 我的意思是,这有关系吗?他们都做同样的事情。
  • @senshin,是的,一个是 pythonic,另一个不是。
  • @PadraicCunningham 来吧,你知道我使用分号是因为 cmets 中不能有换行符。

标签: python arrays loops for-loop iteration


【解决方案1】:

我认为@Beasley 的建议效果很好,我建议在其之上使用multiprocessing,以便并行生成输出。您的计算似乎完全可以并行化!

我可以提供的内容无法击败此处讨论的技巧: Does python support multiprocessor/multicore programming?

【讨论】:

    【解决方案2】:

    使用 numpy ... 在 C++ 中执行操作,因此速度更快 ...(特别是如果我们假设您的数组远大于 3 个项目)

    w = numpy.array([1, -2, 5])
    x = numpy.array([0, 3, 2])
    
    y = w+x
    z = w-x
    

    【讨论】:

    • 谢谢。这是一个赢家。如此简单优雅。
    猜你喜欢
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 2021-07-06
    • 2010-10-21
    相关资源
    最近更新 更多