Python 求前n个自然数之和的两个运算的性能
我正在研究并提出以下解决方案:Python 求前n个自然数之和的两个运算的性能,python,performance,math,Python,Performance,Math,我正在研究并提出以下解决方案: import math def main(): num = 0 j = 0 numFactors = 0 while numFactors <= 500: j += 1 num = num + j #num = sum of numbers from 1 to j #num = (j *(j+1))//2 numFactors = 0 f
import math
def main():
num = 0
j = 0
numFactors = 0
while numFactors <= 500:
j += 1
num = num + j #num = sum of numbers from 1 to j
#num = (j *(j+1))//2
numFactors = 0
for n in range(1,int(math.sqrt(num))):
if num % n == 0:
numFactors += 2
print(num)
if __name__ == '__main__':
from timeit import Timer
t = Timer(lambda: main())
print(t.timeit(number=1))
导入数学
def main():
num=0
j=0
numFactors=0
虽然numFactors我在我的机器上看不到任何性能上的差异。如果乘法实际上比加法快,我也会有点惊讶
我们可以使用从两个变体中反汇编字节码。在两个变体中,大多数都是相同的,因此两个函数中的性能应该是相同的。这是两个不同的部分(第11行是num=num+j
,第12行是num=(j*(j+1))//2
):
两个分解中都存在三个操作。这里再次显示,仅显示每个变体独有的行:
11 43 LOAD_FAST 0 (num)
12 43 LOAD_FAST 1 (j)
49 LOAD_CONST 3 (1)
53 BINARY_MULTIPLY
54 LOAD_CONST 4 (2)
57 BINARY_FLOOR_DIVIDE
如果乘法确实比加法快,那么我希望精通字节码的人能够解释为什么num
的LOAD\u FAST
比第12行的五个运算快。但在我的外行看来,我希望字节码运算量更多的变体需要更长的时间。在我的计算机上没有明显的加速(乘法运算实际上慢了0.8%)。顺便说一下,lambda:main()
相当于main
,如果num
为正方形,则您的numFactors
将关闭1。因为三角形数字从来都不是正方形,所以这个问题不会有问题,但如果你重复使用这个代码,它可能是。这一切都很有道理,这就是为什么我如此困惑的原因。在我的机器上,乘法版本大约快5%。
11 43 LOAD_FAST 0 (num)
12 43 LOAD_FAST 1 (j)
49 LOAD_CONST 3 (1)
53 BINARY_MULTIPLY
54 LOAD_CONST 4 (2)
57 BINARY_FLOOR_DIVIDE