[英]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 pylist1
和print 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.