计算多个并行数组的最优雅/高效/Pythonic方式是什么?

3

对于一些计量经济学的工作。

我经常需要根据(可能)大量的并行数据数组派生多个并行计算变量数组。

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

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

方法A:

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)

第二种方法:

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与C:我知道C更符合Pythonic的风格,但B似乎更方便、更简洁,并且随着更多变量的添加可以更好地扩展。在这两种情况下,我都讨厌要在额外的行上声明变量。

总体而言,我对以上任何一种方法都不完全满意。我的理解是否存在问题或者是否有更好的方法?


1
你考虑过使用 numpy 吗?在 Python 中,大部分科学计算都是用 numpy 完成的。在 numpy 中,这只需要写成 y = w + x; z = w - x - senshin
1
@PadraicCunningham 我的意思是,这有关紧要吗?它们都能做同样的事情。 - senshin
@senshin,是的,一个是Pythonic的,另一个不是。 - Padraic Cunningham
1
@PadraicCunningham,你知道我使用分号是因为在注释中不能有换行符。 - senshin
@cas5nq 噢,所以你已经在使用numpy了?在这种情况下,你应该一定要阅读一份numpy教程(例如http://wiki.scipy.org/Tentative_NumPy_Tutorial),因为在numpy中有很多很棒的数学操作是在普通的Python中无法实现的。 - senshin
显示剩余4条评论
2个回答

2

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

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

y = w+x
z = w-x

谢谢。这是一个胜利者。如此简单而优雅。 - cas5nq

0

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

我能提供的东西无法击败这里讨论的技巧: Python支持多处理器/多核编程吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接