Python 模和FizzBuzz的计算复杂性

Python 模和FizzBuzz的计算复杂性,python,time-complexity,complexity-theory,Python,Time Complexity,Complexity Theory,所以我不想讨论这是否是FizzBuzz挑战的最完美代码 对于那些不熟悉FizzBuzz的人,打印1-100的范围有四条规则: 打印出所有数字 如果数字可以被3整除,则打印“嘶嘶声” 如果数字可以被5整除,则打印“Buzz” 如果号码是 可被3和5整除,打印“FizzBuzz”。) 我运行了两个实现来比较它们的速度: # Code A %%timeit for i in range(1,10001): if i % 15 == 0: print('FizzBuzz')

所以我不想讨论这是否是FizzBuzz挑战的最完美代码

对于那些不熟悉FizzBuzz的人,打印1-100的范围有四条规则:

  • 打印出所有数字
  • 如果数字可以被3整除,则打印“嘶嘶声”
  • 如果数字可以被5整除,则打印“Buzz”
  • 如果号码是 可被3和5整除,打印“FizzBuzz”。)
  • 我运行了两个实现来比较它们的速度:

    # Code A
    %%timeit
    for i in range(1,10001):
        if i % 15 == 0:
            print('FizzBuzz')
        elif i % 3 == 0:
            print('Fizz')
        elif i % 5 == 0:
            print('Buzz')
        else:
            print(i)
    

    尽管对代码B进行了额外的
    if
    计算,但它始终比代码A运行得更快。较大的数值是否会导致较慢的模?这背后的原因是什么?

    我能想到的主要原因可能是优化

    版本B多次使用相同的操作,即:

    • i mod 5
    • i模块3
    一个相当智能的编译器/解释器可能会发现这一点,并计算这些中间结果。通过这样做,它将能够立即计算整个if块,只需2个mod操作

    简言之,我认为最终执行的代码可能如下所示:

    for i in range(1,10001):
        a = i % 5
        b = i % 3
        if a == 0 and b == 0:
            print('FizzBuzz')
        elif b == 0:
            print('Fizz')
        elif a == 0:
            print('Buzz')
        else:
            print(i)
    

    然而,块A中的代码可能太复杂了。我的意思是,编译器总是被迫执行3个mod操作。除非它能够以某种方式发现15=3*5,并使用该逻辑重新处理if语句。

    我无法重现此结果。当我运行代码时,有时A更快,有时B更快
    for i in range(1,10001):
        a = i % 5
        b = i % 3
        if a == 0 and b == 0:
            print('FizzBuzz')
        elif b == 0:
            print('Fizz')
        elif a == 0:
            print('Buzz')
        else:
            print(i)