加快 Python 中简单多项式表达式的计算速度

Speed up evaluation of simple polynomial expression in Python

我编写了一个相当大的 Python 程序来对以三次贝塞尔样条列表形式给出的数据进行一些分析。它非常慢,令我惊讶的是,在分析之后我发现大部分时间都花在了以下非常简单的函数上。

    def point(P0,P1,P2,P3,t):
        return ((1-t)**3 * P0) + \
               (3 * (1-t)**2 * t * P1) + \
               (3 * (1-t) * t**2 * P2) + \
               (t**3 * P3)

其中 t 是浮点数,P0、P1、P2 和 P3 是复数。

我担心,尝试减少此函数的执行次数会让我很头疼,并且可能会降低结果的准确性,因此在我尝试之前,我想知道是否有人知道一个简单的方法加快速度的方法。

我听说我可以将它编译为一个 C/C++ 函数,可以从我的 python 代码中调用,但我从来没有做过那样的事情(而且我已经有很长时间没有使用 C/C++ 来做任何事情了)所以我想在花时间深入研究类似的东西之前获得专家意见。

另外,说得更透彻一点,上面的函数实际上是一个名为svg.path的模块中Pathclass的一个方法。它的确切语法如下。

    def point(self, pos):
        """Calculate the x,y position at a certain position of the path"""
        return ((1-pos) ** 3 * self.start) + \
               (3 * (1-pos) ** 2 * pos * self.control1) + \
               (3 * (1-pos) * pos ** 2 * self.control2) + \
               (pos ** 3 * self.end)

如果您将 ** 替换为 * 并将多项式因式分解为:

def point(P0, P1, P2, P3, t):
    return P0 + \ 
        t * (3 * (P1 - P0) + \
        t * (3 * (P0 + P2) - 6 * P1 + \
        t * (-P0 + 3 * (P1 - P2) + P3)))

您的性能几乎提高了 2 倍。