如何在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 数值库sum和range函数:
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
我认为你的实际问题不是用铅笔和纸那么容易解决的:)