readFile、prepDict、test の 3 つの関数で速度テストを行っています。テストは単純に prepDict(readFile) です。次に、timeit モジュールを使用してこれらを何度も実行しています。
ループ数を 10 倍にすると、関数 prepDict は ~100 倍長くかかりますが、関数 prepDict を使用する関数テストは 10 だけ増加します。
ここに関数とテストがあります。
def readFile(filepath):
tempDict = {}
file = open(filepath,'rb')
for line in file:
split = line.split('\t')
tempDict[split[1]] = split[2]
return tempDict
def prepDict(tempDict):
for key in tempDict.keys():
tempDict[key+'a'] = tempDict[key].upper()
del tempDict[key]
return tempDict
def test():
prepDict(readFile('two.txt'))
if __name__=='__main__':
from timeit import Timer
t = Timer(lambda: readFile('two.txt'))
print 'readFile(10000): ' + str(t.timeit(number=10000))
tempDict = readFile('two.txt')
t = Timer(lambda: prepDict(tempDict))
print 'prepDict (10000): ' + str(t.timeit(number=10000))
t = Timer(lambda: test())
print 'prepDict(readFile) (10000): ' + str(t.timeit(number=10000))
t = Timer(lambda: readFile('two.txt'))
print 'readFile(100000): ' + str(t.timeit(number=100000))
tempDict = readFile('two.txt')
t = Timer(lambda: prepDict(tempDict))
print 'prepDict (100000): ' + str(t.timeit(number=100000))
t = Timer(lambda: test())
print 'prepDict(readFile) (100000): ' + str(t.timeit(number=100000))
私が得る結果は次のとおりです。
readFile(10000): 0.61602914474
prepDict (10000): 0.200615847469
prepDict(readFile) (10000): 0.609288647286
readFile(100000): 5.91858320729
prepDict (100000): 18.8842101717
prepDict(readFile) (100000): 6.45040039665
何度も実行すると、同様の結果が得られます。prepDict 関数を使用しているにもかかわらず、prepDict(readFile) は 10 倍しか増加しないのに、なぜ prepDict は最大 100 倍増加するのですか?
two.txt は、次のデータ ポイントを含む表形式の区切りファイルです。
Item Title Hello2
Item Desc Testing1232
Item Release 2011-02-03