发电机效率

2024-05-16 04:01:38 发布

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

我正在写一些软件来创建一个复杂的波形(实际上是声波)作为一个阵列。从一些原始波形(正弦波等)开始,会有一些函数将它们组合起来以产生更复杂的波,还有更多的函数将这些波组合起来,等等

它可能看起来像:

f(mult(sine(), env(square(), ramp()))

但要复杂得多。在

一种方法是使每个函数成为一个生成器,这样整个函数树对每个元素执行一次,每个生成器每次生成一个值。在

数组可以有几百万个元素,而函数树的深度很容易达到10。这样做发电机的效率会低得离谱吗?在

另一种方法是让每个函数创建并返回整个数组。这可能会更有效,但也有缺点(mesier实现,在计算结束之前没有可用的结果,可能会占用大量内存)。在

他们总是说你不应该再去猜测Python的效率,但是在这种情况下,生成器会花费很长时间吗?在


Tags: 方法函数env元素软件数组发电机效率
2条回答

生成器是惰性序列。当你有很长的序列时,它们非常适合使用,只要你可以分段操作(无论是元素级的,还是大小合理的块)。在

这会减少你的峰值内存使用。只是不要把序列的所有元素都存储在某个地方而破坏了它。在

在我看来,发电机很适合这项任务。在

有些信号具有有限的时间(如包络线或斜坡),但有些信号是无限的(如振荡器)。在

使用生成器,您不必担心这一点,因为-就像zip()函数一样,一个将振荡器与包络线结合(例如相乘)的函数只会消耗振荡器gen中的有限数量的项,因为至少有一个生成器生成有限数量的样本。在

然而,使用发电机是非常优雅和Python。在

回想一下这样的发电机:

def sine(freq):
    phase = 0.0
    while True:
        yield math.sin(phase)
        phase += samplerate/freq

对这样的类来说只是语法上的甜点:

^{pr2}$

因此,性能开销并不比其他任何可以手工制作的解决方案多(比如块处理,通常在DSP算法中使用)。在

如果不生成单个样本,而是生成多个样本块(例如,一次生成1024个样本),也许可以获得一些效率。在

相关问题 更多 >