0

私はPythonに取り組もうとしており、これにはMark Lutzの「Learning python」を使用しています。私は今、タイムトラッキングのエクササイズをしています。

タイムトラッキングを行うために私が使用する関数は次のとおりです(これらは本からの単なるコピーです):

    import time, sys
    trace = lambda *args: None  # or print
    timefunc = time.clock if sys.platform == 'win32' else time.time

    def timer(func, *pargs, _reps=1000, **kargs):
        trace(func, pargs, kargs, _reps)
        start = timefunc()
        for i in range(_reps):
            ret = func(*pargs, **kargs) 
        elapsed = timefunc() - start
        return (elapsed, ret)

    def best(func, *pargs, _reps=50, **kargs):
        best = 2 ** 32
        for i in range(_reps):
            (time, ret) = timer(func, *pargs, _reps=1, **kargs)
            if time < best: best = time
        return (best, ret)

数値の平方根を取得する 3 つの方法をテストしmath.sqrtますx**.5pow(x, .5)

これが私のメインファイルです:

from math import sqrt
import mytimer

def stars(x):
    return x ** .5

def power(x):
    return pow(x, .5)

sqrtmath = mytimer.best(sqrt, 15000, _reps = 1000000)
print(sqrtmath, '\n')

sqrtstars = mytimer.best(stars, 15000, _reps = 1000000)
print(sqrtstars, '\n')

sqrtpow = mytimer.best(power, 15000, _reps = 1000000)
print(sqrtpow, '\n')

sqrtmatha = mytimer.timer(sqrt, 15000, _reps = 1000000)
print(sqrtmatha, '\n')

sqrtstarsa = mytimer.timer(stars, 15000, _reps = 1000000)
print(sqrtstarsa, '\n')

sqrtpowa = mytimer.timer(power, 15000, _reps = 1000000)
print(sqrtpowa, '\n')

次のような結果が得られます。

math.sqrt best (3.0419786956059625e-07, 122.47448713915891) 

** best        (3.0419786956059625e-07, 122.47448713915891) 

pow best       (6.083957391211925e-07, 122.47448713915891) 

math.sqrt sum  (0.23758340345094187, 122.47448713915891) 

** sum         (0.4220751526921207, 122.47448713915891) 

pow sum        (0.48036463590252776, 122.47448713915891) 

ご覧のとおり、math.sqrt バージョンと ** バージョンのベスト タイムは完全に同じですが、それらの累積時間の差はかなり大きいです。どうすればいいの?どこか私のミスですか?私が知らない隠れたpythonメカニズムはありますか?

4

0 に答える 0