Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 求前n个自然数之和的两个运算的性能_Python_Performance_Math - Fatal编程技术网

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