timeit,使用不同的stmts使相同的设置字符串不起作用

时间:2013-08-05 18:04:33

标签: python timeit

我正在尝试使用timeit模块来计算两种插入排序实现的性能。

我想为下面的两个排序函数使用相同的设置数据,所以我想我只是创建一个timeit.Timer实例,然后在我继续时更改实例的stmt属性。这不起作用。

我得到了相同的结果,这与默认stmt='pass'的结果相同。

然而,当我在设置字符串中测试代码时,它似乎正在工作。

import timeit

setup = """
import random


def insort1(seq):
    for a in xrange(1, len(seq)):
        for b in xrange(a, -1, -1):
            if seq[b] < seq[a]:
                break
        else:
            b = -1
        if b + 1 < a:
           seq.insert(b + 1, seq.pop(a))


def insort2(l):
    for i in range(1, len(l)):
        valueToInsert = l[i]
        hole = i
        while hole > 0 and valueToInsert < l[hole - 1]:
            l[hole] = l[hole - 1]
            hole -= 1
        l[hole] = valueToInsert


sorted_samples = [range(100),
          range(1000),
          range(10000)]

reversed_samples = [s[::-1] for s in sorted_samples]

shuffled_samples = map(list, sorted_samples)
for s in shuffled_samples:
    random.shuffle(s)

random_samples = [[random.randint(0, upper) for n in xrange(upper)]
                  for upper in [100, 1000, 10000]]
"""


t = timeit.Timer(setup=setup)
r = 5
n = 1000000
for ind in [0, 1, 2]:

    print 'sample size:100%s\n' % ('0' * ind)

    print '\tinsort1'
    print '\t-------'
    t.stmt = 'insort1(sorted_samples[%s][:])' % ind
    print '\t\tsorted:  ', min(t.repeat(r, n))
    t.stmt = 'insort1(reversed_samples[%s][:])' % ind
    print '\t\treversed:', min(t.repeat(r, n))
    t.stmt = 'insort1(shuffled_samples[%s][:])' % ind
    print '\t\tshuffled:', min(t.repeat(r, n))
    t.stmt = 'insort1(random_samples[%s][:])' % ind
    print '\t\trandom:  ', min(t.repeat(r, n))
    print '\n'

    print '\tinsort2'
    print '\t-------'
    t.stmt = 'insort2(sorted_samples[%s][:])' % ind
    print '\t\tsorted:  ', min(t.repeat(r, n))
    t.stmt = 'insort2(reversed_samples[%s][:])' % ind
    print '\t\treversed:', min(t.repeat(r, n))
    t.stmt = 'insort2(shuffled_samples[%s][:])' % ind
    print '\t\tshuffled:', min(t.repeat(r, n))
    t.stmt = 'insort2(random_samples[%s][:])' % ind
    print '\t\trandom:  ', min(t.repeat(r, n))
    print '\n'

0 个答案:

没有答案