避免逻辑方程计算中的循环?

Avoid loops in the computation of logistic equation?

我正在尝试计算 Python 中逻辑方程的第 n 个值。用一个循环很容易做到:

import timeit
tic = timeit.default_timer()

x = 0.23
i = 0
n = 1000000000
while (i < n):
    x = 4 * x * (1 - x)
    i += 1

toc = timeit.default_timer()
toc - tic

不过一般也比较费时。正如 abarnert 在 .

中所建议的那样,在 PyPy 中执行此操作会大大提高性能

我还被建议避免 Python 循环并改用 NumPy 数组和向量运算 - 实际上我看不出这些有什么帮助(在我看来 NumPy 运算类似于 Matlab 运算,我也不知道上面的代码可以在 Matlab 中矢量化的任何方式)。

有没有没有循环优化代码的方法?

没有循环?也许吧,但这可能不是最好的方法。重要的是要认识到循环本身并不慢。在高性能代码中,您尽量避免在 pythonmatlab 中使用它们。如果你正在编写C代码,你不必关心。

所以这里优化的一个想法是使用 cython 将您的代码编译为 C 代码:

python版本:

def calc_x(x, n):
    i = 0
    while (i < n):
        x = 4 * x * (1 - x)
        i += 1
    return x

静态类型 cython 版本:

def calc_x_cy(double x, long n):
    cdef long i = 0
    while (i < n):
        x = 4 * x * (1 - x)
        i += 1
    return x

突然间,你的速度快了将近两个数量级:

%timeit calc_x(0.23, n) -> 1 个循环,3 个循环中的最佳:每个循环 26.9 秒

%timeit calc_x_cy(0.23, n) -> 1 个循环,3 个循环中的最佳:每个循环 370 毫秒