2

AndroidでSL4Aのより長い(> 1行)コードスニペットを比較するときに、timeit()を正確なベンチマークとして使用する際にいくつかの問題が発生しました。時間を比較すると、かなり大きな変動があります。(おそらく、android / dalvik vmがcpu時間を割り当てる方法と関係がありますか?)

とにかく、私は、時間の大きな(〜1000)サンプルを分析する手段の仮説検定を使用するスクリプトを作成しました。このアプローチに何か問題がありますか?

from math import sqrt
import timeit

#statistics stuff

mean = lambda x: sum(x) / float(len(x))

def stdev (mean, dataset):
    variance = ((x - mean)**2 for x in dataset)
    deviation = sqrt(sum(variance) / float(len(dataset) - 1))
    return deviation / sqrt(len(dataset))

def interval(mean, sampleDeviation, defaultZ = 1.57):
    margin = sampleDeviation * defaultZ
    return (mean - margin, mean + margin)

def testnull(dataset1, dataset2, defaultZ = 1.57):
    mean1, mean2 = mean(dataset1), mean(dataset2)
    sd1, sd2 = stdev(mean1, dataset1), stdev(mean2, dataset2)
    interval1, interval2 = interval(mean1, sd1, defaultZ), interval(mean2, sd2, defaultZ)
    inside = lambda x, y: y >= x[0] and y <= x[1]
    if inside(interval1, interval2[0]) or inside(interval1, interval2[1]):
        return True
    return False

#timer setup

t1 = timeit.Timer('sum(x)', 'x = (i for i in range(1000))')
t2 = timeit.Timer('sum(x)', 'x = list(range(1000))')

genData, listData = [], []

for i in range(10000):
    genData.append(t1.timeit())
    listData.append(t2.timeit())

# testing the interval
    print('The null hypothesis is {0}'.format(testnull(genData, listData)))
4

1 に答える 1

2

それは理にかなっていると思います。必要なのは、コードの両方のバージョンの信頼区間を比較して重複を確認することです。Georges et al(2007)には、使用しようとしている手法の完全な説明があります。

于 2012-02-19T23:33:11.690 に答える