如何在python中有效地执行大循环的加法

我试图在 python 中通过大循环以有效的方式执行加法。我试图在 100000000 的范围内循环。

from datetime import datetime

start_time = datetime.now()
sum = 0
for i in range(100000000):
    sum+=i
end_time = datetime.now()
print('--- %s seconds ---{}'.format(end_time - start_time))
print(sum)

上面代码的输出是 --- %s 秒 ---0:00:16.662666 4999999950000000

当我尝试在 C 中进行时,它需要 0.43 秒

从我读到的内容来看,每次对变量执行加法时,python 都会创建新的内存。我阅读了一些文章,并通过避免 '+' 符号来了解如何在这些情况下执行字符串连接。但我没有找到任何处理整数的方法。

回答

sum()如果您可以处理整个列表,请考虑使用该函数,它完全在 C 代码中循环并且速度更快,并且还避免了创建新的 Python 对象。

sum(range(100000000))

在我的电脑中,你的代码需要07.189210几秒钟,而上面的语句需要02.751251几秒钟,处理速度提高了3倍以上。

编辑:正如mtrw所建议的那样, numpy.sum() 可以加快处理速度。


回答

这是三种方法的比较:您的原始方式,sum(range(100000000))按照Alex Metsai 的建议使用,以及使用 NumPy 数值库sumrange函数:

from datetime import datetime
import numpy as np

def orig():
    start_time = datetime.now()
    sum = 0
    for i in range(100000000):
        sum+=i
    end_time = datetime.now()
    print('--- %s seconds ---{}'.format(end_time - start_time))
    print(sum)

def pyway():
    start_time = datetime.now()
    mysum = sum(range(100000000))
    end_time = datetime.now()
    print('--- %s seconds ---{}'.format(end_time - start_time))
    print(mysum)

def npway():
    start_time = datetime.now()
    sum = np.sum(np.arange(100000000))
    end_time = datetime.now()
    print('--- %s seconds ---{}'.format(end_time - start_time))
    print(sum)

在我的电脑上,我得到:

>>> orig()
--- %s seconds ---0:00:09.504018
4999999950000000
>>> pyway()
--- %s seconds ---0:00:02.382020
4999999950000000
>>> npway()
--- %s seconds ---0:00:00.683411
4999999950000000

NumPy 是最快的,如果您可以在您的应用程序中使用它。

但是,正如Ethan在评论中所建议的那样,值得指出的是,直接计算答案是迄今为止最快的:

def mathway():
    start_time = datetime.now()
    mysum = 99999999*(99999999+1)/2
    end_time = datetime.now()
    print('--- %s seconds ---{}'.format(end_time - start_time))
    print(mysum)


>>> mathway()
--- %s seconds ---0:00:00.000013
4999999950000000.0

我认为你的实际问题不是用铅笔和纸那么容易解决的:)


以上是如何在python中有效地执行大循环的加法的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>