繁体   English   中英

Python timeit函数因NameError崩溃:全局名称不存在

[英]Python timeit function crashing with NameError: global name does not exist

我试图在python2.7中对两个可比较的语句进行基准测试。

一个语句打印从内存中检索到的数字列表。 另一个语句打印从相同服务器上维护的redis列表中检索到的相同编号的列表。

例如

pylist1 = [1,2,3,4,5]
pylist2 = my_server.lrange("nums:5",0,-1) #where nums:5 = [1,2,3,4,5]

如何使用timeit来对print pylist1print pylist2进行基准测试?

我正在python shell中尝试以下操作:

import timeit
import redis
POOL = redis.ConnectionPool(host='127.0.0.1',port=6379,db=0)
my_server = redis.Redis(connection_pool=POOL)
pylist1 = [1,2,3,4,5]
pylist2 = my_server.lrange("nums:5",0,-1)
print min(timeit.Timer('print pylist1').repeat(7,1000))

这只是崩溃与NameError: global name 'pylist1' does not exist 这很奇怪,因为print pylist1可以完美工作! 在做我打算正确做的事情时需要帮助。

Timer的文档说:

用于计时小代码段的执行速度的类。

构造函数接受一条要计时的语句,一条用于设置的附加语句以及一个计时器函数。 这两个语句默认为'pass'; 计时器功能取决于平台(请参阅模块文档字符串)。 如果指定了'globals',则代码将在该名称空间内执行(与timetime内部的名称空间相对)。

[...]

这告诉您,默认情况下,由Timer执行的语句是在其自己的名称空间中执行的,该名称空间无法访问外部名称空间,也无法对其进行修改。 要更改此设置,可以使用setup语句导入所需的名称:

Timer(..., setup='from __main__ import pylist1')

或仅指定使用当前名称空间执行代码:

Timer(..., globals=globals())

请注意,如果您要计时的语句修改了变量,则它们实际上将在模块中更改。 最好使用globals的副本:

Timer(...., globals=globals().copy())

# even better

import copy
Timer(..., globals={'pylist1': copy.deepcopy(pylist1))

在此情况下,正在分析的代码不会修改您的全局变量

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM