r = np.arange(100)
results = []
for i in r:
for j in r:
for k in r:
for l in r:
#Here f is some predefined function
if f(i,j,k,l) < 5.0:
results.append(f(i,j,k,l))
使用NumPy的^{}和{a2}可以避免for循环和if语句。提出的方法被包装在comb_np(n)中,而@Ohad-Eytan提出的基于itertools的解决方案被包装在comb_it(n)中。为了方便起见,每个For循环(在您的示例中为100)上的迭代次数作为参数传递给两个函数(n)。为了比较分析这两种方法,我使用了一个简单的政治函数f(x, y, z, t)。在
from numpy import fromfunction
from itertools import product
from numpy import arange
def f(x, y, z, t):
return x + 2*y + 3*z + 4*t
def comb_np(n):
arr = fromfunction(f, (n,)*4)
return arr[arr < 5.0]
def comb_it(n):
return [f(i,j,k,l) for (i,j,k,l) in product(arange(n),repeat=4) if f(i,j,k,l) < 5.0]
使用NumPy的^{} 和{a2}可以避免for循环和if语句。提出的方法被包装在
comb_np(n)
中,而@Ohad-Eytan提出的基于itertools
的解决方案被包装在comb_it(n)
中。为了方便起见,每个For循环(在您的示例中为100
)上的迭代次数作为参数传递给两个函数(n
)。为了比较分析这两种方法,我使用了一个简单的政治函数f(x, y, z, t)
。在样本运行:
^{pr2}$两种方法产生相同的结果。到目前为止,还不错。但现在让我们来评估一下在效率方面是否存在任何差异:
从上面的结果可以清楚地看出,在这个特定的问题中,NumPy的向量化代码比迭代器的性能高出大约两个数量级。在
有趣的是,我发现只要将NumPy的}的性能就会显著提高:
arange
替换为内置函数range
,那么{结果:
使用
itertools
笛卡尔积:或者更简洁的方式,使用列表理解:
^{pr2}$相关问题 更多 >
编程相关推荐