大多数 elegant/efficient/Pythonic 计算多个并行数组的方法?
Most elegant/efficient/Pythonic way to calculate multiple parallel arrays?
一些计量经济学的工作。
我经常需要在给定(可能)大量并行数据数组的情况下派生多个计算变量的并行数组。
在下面的示例中,我有两个输入数组和两个输出数组,但想象一下在现实世界中可能有 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)
方法二:
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 更像 pythonic,但 B 似乎更方便和简洁,并且随着更多变量的扩展性更好。在这两种情况下,我都讨厌必须预先声明变量的额外行。
总的来说,我对上述任何一种方法都不完全满意。我的推理中是否遗漏了什么或者是否有更好的方法?
使用 numpy ... 在 C++ 中执行操作,因此速度更快 ...(特别是如果我们假设您的数组比 3 个项目大得多)
w = numpy.array([1, -2, 5])
x = numpy.array([0, 3, 2])
y = w+x
z = w-x
我认为@Beasley 的建议很有效,我建议在其之上使用 multiprocessing
,以便并行生成输出。您的计算似乎完全可以并行化!
我能提供的不能胜过这里讨论的提示:
Does python support multiprocessor/multicore programming?
一些计量经济学的工作。
我经常需要在给定(可能)大量并行数据数组的情况下派生多个计算变量的并行数组。
在下面的示例中,我有两个输入数组和两个输出数组,但想象一下在现实世界中可能有 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)
方法二:
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 更像 pythonic,但 B 似乎更方便和简洁,并且随着更多变量的扩展性更好。在这两种情况下,我都讨厌必须预先声明变量的额外行。
总的来说,我对上述任何一种方法都不完全满意。我的推理中是否遗漏了什么或者是否有更好的方法?
使用 numpy ... 在 C++ 中执行操作,因此速度更快 ...(特别是如果我们假设您的数组比 3 个项目大得多)
w = numpy.array([1, -2, 5])
x = numpy.array([0, 3, 2])
y = w+x
z = w-x
我认为@Beasley 的建议很有效,我建议在其之上使用 multiprocessing
,以便并行生成输出。您的计算似乎完全可以并行化!
我能提供的不能胜过这里讨论的提示: Does python support multiprocessor/multicore programming?