Python 模和FizzBuzz的计算复杂性
所以我不想讨论这是否是FizzBuzz挑战的最完美代码 对于那些不熟悉FizzBuzz的人,打印1-100的范围有四条规则: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')
# 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
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)