はじめに
最速のFizzBuzzってどんなもんなんじゃろ、と思い、いくつかコーディングしてみた。
やり方
1から100までのFizzBuzzを標準出力する関数について、100回実行時の時間を計測する。時間計測時でもprintのコメントアウトは行わない。
FizzBuzz問題
1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。
時間計測方法
import time
dict = {}
for func in [main1, main2, main3, main4, main5,main6, main7]:
total = 0
for i in range(100):
s = time.time()
func(1,101)
e = time.time()
total += e - s
dict[func.__name__] = total
main1
とりあえずオーソドックスに。
def main1(start,stop):
for i in range(start,stop):
if (i%15) == 0:
print 'FizzBuzz'
elif (i%5) == 0:
print 'Buzz'
elif (i%3) == 0:
print 'Fizz'
else:
print i
main2
Webを参考に、ifを入れ子にしてifの実行回数を減らしてみた。
def main2(start,stop):
for i in range(start,stop):
if (i%3) == 0:
if (i%5) == 0:
print 'FizzBuzz'
else:
print 'Fizz'
else:
if (i%5) == 0:
print 'Buzz'
else:
print i
main3
15の余りについてリストを作ってみた。
def main3(start,stop):
fizzbuzz_list = []
for i in range(15):
if (i%15) == 0:
fizzbuzz_list.append('FizzBuzz')
elif (i%5) == 0:
fizzbuzz_list.append('Buzz')
elif (i%3) == 0:
fizzbuzz_list.append('Fizz')
else:
fizzbuzz_list.append(0)
for i in range(start,stop):
print fizzbuzz_list[i%15] if fizzbuzz_list[i%15] else i
main4
main3のリストをあらかじめ手入力しておいた。
def main4(start,stop):
fizzbuzz_list = ['FizzBuzz', 0, 0, 'Fizz', 0, 'Buzz', 'Fizz', 0, 0, 'Fizz', 'Buzz', 0, 'Fizz', 0, 0 ]
for i in range(start,stop):
print fizzbuzz_list[i%15] if fizzbuzz_list[i%15] else i
main5
print の回数を1回にしてみた。
def main5(start,stop):
fizzbuzz = ''
for i in range(start,stop):
if (i%3) == 0:
if (i%5) == 0:
fizzbuzz += 'FizzBuzz\n'
else:
fizzbuzz += 'Fizz\n'
else:
if (i%5) == 0:
fizzbuzz += 'Buzz\n'
else:
fizzbuzz += str(i) + "\n"
print fizzbuzz
main6
そもそもforもifも全部とっぱらってみた。
def main6(start,stop):
print 1
print 2
print "Fizz"
print 4
print "Buzz"
print "Fizz"
print 7
print 8
print "Fizz"
print "Buzz"
print 11
print "Fizz"
print 13
print 14
print "FizzBuzz"
print 16
print 17
print "Fizz"
print 19
print "Buzz"
print "Fizz"
print 22
print 23
print "Fizz"
print "Buzz"
print 26
print "Fizz"
print 28
print 29
print "FizzBuzz"
print 31
print 32
print "Fizz"
print 34
print "Buzz"
print "Fizz"
print 37
print 38
print "Fizz"
print "Buzz"
print 41
print "Fizz"
print 43
print 44
print "FizzBuzz"
print 46
print 47
print "Fizz"
print 49
print "Buzz"
print "Fizz"
print 52
print 53
print "Fizz"
print "Buzz"
print 56
print "Fizz"
print 58
print 59
print "FizzBuzz"
print 61
print 62
print "Fizz"
print 64
print "Buzz"
print "Fizz"
print 67
print 68
print "Fizz"
print "Buzz"
print 71
print "Fizz"
print 73
print 74
print "FizzBuzz"
print 76
print 77
print "Fizz"
print 79
print "Buzz"
print "Fizz"
print 82
print 83
print "Fizz"
print "Buzz"
print 86
print "Fizz"
print 88
print 89
print "FizzBuzz"
print 91
print 92
print "Fizz"
print 94
print "Buzz"
print "Fizz"
print 97
print 98
print "Fizz"
print "Buzz"
main7
print文1行だけにしてみた。
def main7(start,stop):
print "1\n2\nFizz\n4\nBuzz\nFizz\n7\n8\nFizz\nBuzz\n11\nFizz\n13\n14\nFizzBuzz\n16\n17\nFizz\n19\nBuzz\nFizz\n22\n23\nFizz\nBuzz\n26\nFizz\n28\n29\nFizzBuzz\n31\n32\nFizz\n34\nBuzz\nFizz\n37\n38\nFizz\nBuzz\n41\nFizz\n43\n44\nFizzBuzz\n46\n47\nFizz\n49\nBuzz\nFizz\n52\n53\nFizz\nBuzz\n56\nFizz\n58\n59\nFizzBuzz\n61\n62\nFizz\n64\nBuzz\nFizz\n67\n68\nFizz\nBuzz\n71\nFizz\n73\n74\nFizzBuzz\n76\n77\nFizz\n79\nBuzz\nFizz\n82\n83\nFizz\nBuzz\n86\nFizz\n88\n89\nFizzBuzz\n91\n92\nFizz\n94\nBuzz\nFizz\n97\n98\nFizz\nBuzz"
結果
main5が最速となった。やはりprintで時間がかかっている模様。
main1 2.381
main2 1.380
main3 2.006
main4 1.723
main5 0.333
main6 1.124
main7 0.336
補足
main6()を作った関数。
def sub6(start,stop):
filename = 'fast_fizzbuzz2.py'
fizzbuzz = 'def main1():\n'
for i in range(start,stop):
fizzbuzz += ' print '
if (i%3) == 0:
if (i%5) == 0:
fizzbuzz += '"FizzBuzz"\n'
else:
fizzbuzz += '"Fizz"\n'
else:
if (i%5) == 0:
fizzbuzz += '"Buzz"\n'
else:
fizzbuzz += str(i) + "\n"
f = open(filename,'a' )
f.write(fizzbuzz)
f.close()
main7()を作った関数
def sub7(start,stop):
filename = 'fast_fizzbuzz2.py'
fizzbuzz = 'def main2():\n'
fizzbuzz += ' print "'
for i in range(start,stop):
if (i%3) == 0:
if (i%5) == 0:
fizzbuzz += r'FizzBuzz\n'
else:
fizzbuzz += r'Fizz\n'
else:
if (i%5) == 0:
fizzbuzz += r'Buzz\n'
else:
fizzbuzz += r'%s\n' % str(i)
fizzbuzz += '"'
f = open(filename,'a')
f.write(fizzbuzz)
f.close()