gpt4 book ai didi

python - 在没有并行化的情况下提高功能的性能

转载 作者:太空宇宙 更新时间:2023-11-04 10:39:04 25 4
gpt4 key购买 nike

几周前我发布了一个问题(Speed up nested for loop with elements exponentiation),abarnert 得到了很好的回答。 .这个问题与那个问题相关,因为它利用了上述用户建议的性能改进。

我需要提高一个函数的性能,该函数涉及计算三个因子,然后对它们应用指数函数。

这是我的代码的 MWE:

import numpy as np
import timeit

def random_data(N):
# Generate some random data.
return np.random.uniform(0., 10., N)

# Data lists.
array1 = np.array([random_data(4) for _ in range(1000)])
array2 = np.array([random_data(3) for _ in range(2000)])

# Function.
def func():
# Empty list that holds all values obtained in for loop.
lst = []
for elem in array1:
# Avoid numeric errors if one of these values is 0.
e_1, e_2 = max(elem[0], 1e-10), max(elem[1], 1e-10)
# Obtain three parameters.
A = 1./(e_1*e_2)
B = -0.5*((elem[2]-array2[:,0])/e_1)**2
C = -0.5*((elem[3]-array2[:,1])/e_2)**2
# Apply exponential.
value = A*np.exp(B+C)
# Store value in list.
lst.append(value)

return lst

# time function.
func_time = timeit.timeit(func, number=100)
print func_time

是否有可能加速 func 而不必重复并行化?

最佳答案

这是我目前所拥有的。我的方法是尽可能多地跨 numpy 数组进行数学运算。

优化:

  • 在 numpy 中计算 A
  • 通过将BC 拆分为因子来重构计算,其中一些可以在 numpy 中计算

代码:

def optfunc():
e0 = array1[:, 0]
e1 = array1[:, 1]
e2 = array1[:, 2]
e3 = array1[:, 3]

ar0 = array2[:, 0]
ar1 = array2[:, 1]

As = 1./(e0 * e1)
Bfactors = -0.5 * (1 / e0**2)
Cfactors = -0.5 * (1 / e1**2)

lst = []
for i, elem in enumerate(array1):
B = ((elem[2] - ar0) ** 2) * Bfactors[i]
C = ((elem[3] - ar1) ** 2) * Cfactors[i]

value = As[i]*np.exp(B+C)

lst.append(value)

return lst

print np.allclose(optfunc(), func())

# time function.
func_time = timeit.timeit(func, number=10)
opt_func_time = timeit.timeit(optfunc, number=10)
print "%.3fs --> %.3fs" % (func_time, opt_func_time)

结果:

True
0.759s --> 0.485s

此时我被卡住了。我设法完全不用 python for 循环来完成它,但是由于我还不明白的原因,它比上面的版本慢:

def optfunc():
x = array1
y = array2

x0 = x[:, 0]
x1 = x[:, 1]
x2 = x[:, 2]
x3 = x[:, 3]

y0 = y[:, 0]
y1 = y[:, 1]

A = 1./(x0 * x1)
Bfactors = -0.5 * (1 / x0**2)
Cfactors = -0.5 * (1 / x1**2)

B = (np.transpose([x2]) - y0)**2 * np.transpose([Bfactors])
C = (np.transpose([x3]) - y1)**2 * np.transpose([Cfactors])

return np.transpose([A]) * np.exp(B + C)

结果:

True
0.780s --> 0.558s

但是请注意,后者会为您提供一个 np.array,而前者只会为您提供一个 Python 列表……这可能是造成差异的原因,但我不确定。

关于python - 在没有并行化的情况下提高功能的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21838278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com