使用生成器而不是嵌套循环

时间:2013-12-28 23:27:41

标签: python iteration generator nested-loops

我有以下嵌套循环。但是时间效率低下。所以使用发电机会好得多。你知道怎么做吗?

x_sph[:] = [r*sin_t*cos_p for cos_p in cos_phi for sin_t in sin_theta for r in p]     

在这种情况下,似乎有些人(看评论)认为使用生成器没有帮助。我认为使用生成器会避免将变量分配给内存,从而节省内存和时间。我错了吗?

3 个答案:

答案 0 :(得分:3)

从您的代码段判断,您想要做一些数字化的事情,并希望快速完成。在这方面,发电机不会有太大帮助。但是使用numpy模块会。这样做:

import numpy
# Change your p into an array, you'll see why.
r = numpy.array(p) # If p is a list this will change it into 1 dimensional vector.
sin_theta = numpy.array(sin_theta) # Same with the rest.
cos_phi = numpy.array(cos_phi)

x_sph = r.dot(sin_theta).dot(cos_theta)

事实上,我甚至更早地使用numpy

phi = numpy.array(phi) # I don't know how you calculate this but you can start here with a phi list.
theta = numpy.array(theta)

sin_theta  =numpy.sin(theta)
cos_phi = numpy.array(phi)

您甚至可以跳过中间sin_thetacos_phi分配,只需将所有内容放在一行中即可。这将是漫长而复杂的,所以我会省略它,但我会numpy - 有时候这样的数学。

而且numpy很快,它会产生巨大的变化。至少是一个值得注意的。

答案 1 :(得分:2)

[...]创建一个列表并(...)生成器:

generator = (r*sin_t*cos_p for cos_p in cos_phi for sin_t in sin_theta for r in p)
for value in generator:
    # Do something

答案 2 :(得分:0)

要将循环转换为生成器,您可以将其设为函数yield

def x_sph(p, cos_phi, sin_theta):
    for r in p:
        for sin_t in sin_theta:
            for cos_p in cos_phi:
                yield r * sin_t * cos_p

但是,请注意,如果您不需要计算所有值,并且某些时候可以break,或者如果您不想存储所有值(后者是一个空间而不是时间优势)。如果你最终打电话给:

lst = list(x_sph(p, cos_phi, sin_theta))
那时你不会看到任何收获。