避免逻辑方程计算中的循环?
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 中矢量化的任何方式)。
有没有没有循环优化代码的方法?
没有循环?也许吧,但这可能不是最好的方法。重要的是要认识到循环本身并不慢。在高性能代码中,您尽量避免在 python
或 matlab
中使用它们。如果你正在编写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 毫秒
我正在尝试计算 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 在
我还被建议避免 Python 循环并改用 NumPy 数组和向量运算 - 实际上我看不出这些有什么帮助(在我看来 NumPy 运算类似于 Matlab 运算,我也不知道上面的代码可以在 Matlab 中矢量化的任何方式)。
有没有没有循环优化代码的方法?
没有循环?也许吧,但这可能不是最好的方法。重要的是要认识到循环本身并不慢。在高性能代码中,您尽量避免在 python
或 matlab
中使用它们。如果你正在编写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 毫秒