我有以下嵌套循环。但是时间效率低下。所以使用发电机会好得多。你知道怎么做吗?
x_sph[:] = [r*sin_t*cos_p for cos_p in cos_phi for sin_t in sin_theta for r in p]
在这种情况下,似乎有些人(看评论)认为使用生成器没有帮助。我认为使用生成器会避免将变量分配给内存,从而节省内存和时间。我错了吗?
答案 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_theta
和cos_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))
那时你不会看到任何收获。