【发布时间】:2014-02-17 20:03:06
【问题描述】:
几周前,我发布了一个问题 (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 而不必重复并行化?
【问题讨论】:
-
你在第一次迭代后从你的函数中返回,这是故意的吗?
-
呸,没有抱歉的缩进。我马上修。感谢您的提醒!
-
但是像这样,你只使用最后一次迭代的 A,B,C。
-
您可能还想在函数内移动
lst = []。像这样,你继续添加到同一个列表中,每次你做 timeit 时它都会继续增长。 -
这篇文章应该会给你一些好的想法:ianozsvald.com/…
标签: python arrays performance numpy