带有timeit的Python循环基准测试

时间:2016-08-22 19:23:55

标签: python timeit

我想在Python中的for循环中对特定代码段进行基准测试。我正在使用timeit,如下所示:

def createTokens():
    keypath=('./pickles/key.pickle')
    path="./data/"
    directory = os.listdir(path)
    tok={}
    print('create tokens..')
    t=[2**4,2**5,2**6,2**7,2**8,2**9,2**10,2**12,2**14,2**16]
    files=['pl_10000004','pl_10000002','pl_100000026']
    for filename in files:
        for i in t:
            code='etok=utils.token(filename,keypath,str(i))'
            t = timeit.Timer(stmt=code,setup='from __main__ import utils')
            print(filename+'_'+str(i)+'.pickle')
            print ('%f'%float(t.timeit(10/10)))

然而,这引起了:

NameError: global name 'filename' is not defined

当我在setup变量中包含filename时,Python说:

ImportError: cannot import name filename

这是如何解决的?

2 个答案:

答案 0 :(得分:2)

filename未在timeit块的代码范围中定义。我不知道代码中的utils是什么,但假设它希望filenamekeypath作为字符串只是替换你的

    code='etok=utils.token(filename,keypath,str(i))'

符合:

    code='etok=utils.token("{}","{}",{})'.format(filename, keypath, i)

答案 1 :(得分:1)

试试这个:

let headers = new Headers({ 'Content-Type': 'application/json' });
headers.append( 'XSRF-TOKEN', 'xsrf value' );
let options = new RequestOptions({ headers: headers });

这将允许您创建具有所需值的代码字符串。此外,通过code='etok=utils.token("%s","%s","%s")' % (filename, keypath, i) 转换,%s会被强制转换为i类型。

编辑:围绕值添加双引号。