Re: Python Spam and Eggs: 'pass' vs '...'

http://d.hatena.ne.jp/kyogoku42/20091213/1260710835 の追試を行った。

$ ./python /tmp/test0.py
'pass' for 10^6: 0.0767240524292
'...'  for 10^6: 0.0933971405029
'None' for 10^6: 0.0935978889465
$ ./python /tmp/test0.py
'pass' for 10^6: 0.0788168907166
'...'  for 10^6: 0.0958371162415
'None' for 10^6: 0.0938339233398

"..."のほうが"pass"よりも早いという結果は私の環境では出ていない。
また、実行順序に影響される可能性があるので、これを排除するために次のように書き換えてみた。

import time
import random

def test_pass():
    for i in range(10**6):
        pass
def test_ellipsis():
    for i in range(10**6):
        ...
def test_none():
    for i in range(10**6):
        None

def benchmark(f):
    t0 = time.time()
    f()
    t1 = time.time()
    return t1 - t0

sum_time_pass = 0
sum_time_ellipsis = 0
sum_time_none = 0
def f1():
    global sum_time_pass
    sum_time_pass += benchmark(test_pass)
def f2():
    global sum_time_ellipsis
    sum_time_ellipsis += benchmark(test_ellipsis)
def f3():
    global sum_time_none
    sum_time_none += benchmark(test_none)

for i in range(10**2):
    x = [f1, f2, f3]
    random.shuffle(x)
    for f in x:
        f()

print("'pass' for 10^8: {0}".format(sum_time_pass))
print("'...'  for 10^8: {0}".format(sum_time_ellipsis))
print("'None' for 10^8: {0}".format(sum_time_none))
$ ./python /tmp/test.py 
'pass' for 10^8: 4.6522705555
'...'  for 10^8: 6.02508592606
'None' for 10^8: 5.8259973526
$ ./python /tmp/test.py 
'pass' for 10^8: 4.44432783127
'...'  for 10^8: 5.71288895607
'None' for 10^8: 5.8271188736

やはり、"None"と"..."は大差なく、"pass"は他よりも速いようだ。テストした環境はPython 3.1.1(tar ballからビルド), Ubuntu 9.04 AMD64, Core2 Quad Q6600である。実行にあたってはCPUの動作クロックを2.39GHzに固定した。


なお、私は"pass"の代わりに"..."を使うことには反対したい。"..."は省略を意味するが、"pass"を用いる時は省略しているわけではなくそこに処理がないのである。これはサンプルコードなどを読んでいる時に、何かが省略されていると誤解を与える原因となるのではないだろうか。