用Python迭代

2024-04-26 08:09:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数组,我必须从这两个数组中创建另一个数组:

  for i in arange(0,len(second_array),1):
     third_array[i] = my_function(first_array[i],second_array[i])

这里my_function是一个过程,它以两个标量作为输入,然后返回另一个标量。我的问题是,我通常使用的数组非常庞大,所以上面的循环要花很长时间。有没有一种方法可以避免循环,但仍然按照我想要的方式填充数组third_array?在


Tags: 方法inforlen过程my方式function
3条回答

使用map似乎比列表理解快得多:

import cProfile, numpy as np
from operator import add

A = np.random.rand(1000000)
B = np.random.rand(1000000)

>>> cProfile.run('C = map(add, A, B)')
         3 function calls in 0.693 seconds

>>> cProfile.run('C = [a+b for a,b in izip(A,B)]')
         2 function calls in 0.765 seconds

>>> cProfile.run('for i in np.arange(0,len(B),1): C[i] = A[i]+B[i]')
         4 function calls in 1.971 seconds

但正如@larsmans所说,使用矢量化解决方案将更快:

^{pr2}$

既然你用的是arange,我想你是在用NumPy。尝试重写my_function,使其接受两个数组而不是两个标量值,并使用矢量化操作。在

如果需要访问两个列表的每个元素,如何避免循环?我不太明白你的问题。在

但你可以做得更简单一点。在Python 3中:

third_array = [my_function(a, b) for a, b in zip(first_array, second_array)]

在python2中,最好使用

^{pr2}$

相关问题 更多 >