我正在写一些软件来创建一个复杂的波形(实际上是声波)作为一个阵列。从一些原始波形(正弦波等)开始,会有一些函数将它们组合起来以产生更复杂的波,还有更多的函数将这些波组合起来,等等
它可能看起来像:
f(mult(sine(), env(square(), ramp()))
但要复杂得多。在
一种方法是使每个函数成为一个生成器,这样整个函数树对每个元素执行一次,每个生成器每次生成一个值。在
数组可以有几百万个元素,而函数树的深度很容易达到10。这样做发电机的效率会低得离谱吗?在
另一种方法是让每个函数创建并返回整个数组。这可能会更有效,但也有缺点(mesier实现,在计算结束之前没有可用的结果,可能会占用大量内存)。在
他们总是说你不应该再去猜测Python的效率,但是在这种情况下,生成器会花费很长时间吗?在
生成器是惰性序列。当你有很长的序列时,它们非常适合使用,只要你可以分段操作(无论是元素级的,还是大小合理的块)。在
这会减少你的峰值内存使用。只是不要把序列的所有元素都存储在某个地方而破坏了它。在
在我看来,发电机很适合这项任务。在
有些信号具有有限的时间(如包络线或斜坡),但有些信号是无限的(如振荡器)。在
使用生成器,您不必担心这一点,因为-就像
zip()
函数一样,一个将振荡器与包络线结合(例如相乘)的函数只会消耗振荡器gen中的有限数量的项,因为至少有一个生成器生成有限数量的样本。在然而,使用发电机是非常优雅和Python。在
回想一下这样的发电机:
对这样的类来说只是语法上的甜点:
^{pr2}$因此,性能开销并不比其他任何可以手工制作的解决方案多(比如块处理,通常在DSP算法中使用)。在
如果不生成单个样本,而是生成多个样本块(例如,一次生成1024个样本),也许可以获得一些效率。在
相关问题 更多 >
编程相关推荐