Python timeit NameError
Python timeit NameError
我想用Python3.5中的timeit来测量两个函数。第一个依赖于 import math
,第二个依赖于 from math import log2
。我虽然可以通过在调用 timeit.repeat
时将适当的导入语句作为设置字符串传递来处理这个问题。但是我得到 NameError: name 'math' is not defined
。
我不想将函数作为它们的名称字符串传递。当函数不依赖于导入时,这里的代码可以工作,但我需要它们来调用 math.log2
期待您的回答。
def spam_log_v1():
for _ in range(1000):
math.log2(2)
def spam_log_v2():
for _ in range(1000):
log2(2)
if __name__ == '__main__':
import timeit
repeat = 3
number = 1000
unit = "usec"
unittosec = {"usec": 1e6, "msec": 1000, "sec": 1}
tests = [(spam_log_v1, 'import math'),
(spam_log_v2, 'from math import log2')]
for fct, setup in tests:
res = timeit.repeat(fct, setup=setup, repeat=repeat, number=number)
print("%s: %d loops, best of %d: %.3g %s per loop" %
(fct.__name__, number, repeat,
min(res) / number * unittosec[unit], unit))
The inner
function 是 运行 by timeit.repeat
看起来像这样:
def inner(_it, _timer{init}):
{setup}
_t0 = _timer()
for _i in _it:
{stmt}
_t1 = _timer()
return _t1 - _t0
其中 {setup}
由设置字符串替换,{stmt}
由语句字符串替换。请注意,设置是来自 inner
内部的 运行。因此,如果您在 setup
中放置一个 import 语句,模块名称将成为 inner
的 局部变量 。稍后,当从 stmt
调用 spam_log_v1
时,模块名称对 spam_log_v1
不可用,因为模块名称不在全局范围内。
修复方法是在脚本的全局级别简单地导入 math
and/or from math import log2
。
import math
from math import log2
def spam_log_v1():
for _ in range(1000):
math.log2(2)
def spam_log_v2():
for _ in range(1000):
log2(2)
if __name__ == '__main__':
import timeit
repeat = 3
number = 1000
unit = "usec"
unittosec = {"usec": 1e6, "msec": 1000, "sec": 1}
tests = [
(spam_log_v1, ''),
(spam_log_v2, '')]
for fct, setup in tests:
res = timeit.repeat(fct, setup=setup, repeat=repeat, number=number)
print("%s: %d loops, best of %d: %.3g %s per loop" %
(fct.__name__, number, repeat,
min(res) / number * unittosec[unit], unit))
我想用Python3.5中的timeit来测量两个函数。第一个依赖于 import math
,第二个依赖于 from math import log2
。我虽然可以通过在调用 timeit.repeat
时将适当的导入语句作为设置字符串传递来处理这个问题。但是我得到 NameError: name 'math' is not defined
。
我不想将函数作为它们的名称字符串传递。当函数不依赖于导入时,这里的代码可以工作,但我需要它们来调用 math.log2
期待您的回答。
def spam_log_v1():
for _ in range(1000):
math.log2(2)
def spam_log_v2():
for _ in range(1000):
log2(2)
if __name__ == '__main__':
import timeit
repeat = 3
number = 1000
unit = "usec"
unittosec = {"usec": 1e6, "msec": 1000, "sec": 1}
tests = [(spam_log_v1, 'import math'),
(spam_log_v2, 'from math import log2')]
for fct, setup in tests:
res = timeit.repeat(fct, setup=setup, repeat=repeat, number=number)
print("%s: %d loops, best of %d: %.3g %s per loop" %
(fct.__name__, number, repeat,
min(res) / number * unittosec[unit], unit))
The inner
function 是 运行 by timeit.repeat
看起来像这样:
def inner(_it, _timer{init}):
{setup}
_t0 = _timer()
for _i in _it:
{stmt}
_t1 = _timer()
return _t1 - _t0
其中 {setup}
由设置字符串替换,{stmt}
由语句字符串替换。请注意,设置是来自 inner
内部的 运行。因此,如果您在 setup
中放置一个 import 语句,模块名称将成为 inner
的 局部变量 。稍后,当从 stmt
调用 spam_log_v1
时,模块名称对 spam_log_v1
不可用,因为模块名称不在全局范围内。
修复方法是在脚本的全局级别简单地导入 math
and/or from math import log2
。
import math
from math import log2
def spam_log_v1():
for _ in range(1000):
math.log2(2)
def spam_log_v2():
for _ in range(1000):
log2(2)
if __name__ == '__main__':
import timeit
repeat = 3
number = 1000
unit = "usec"
unittosec = {"usec": 1e6, "msec": 1000, "sec": 1}
tests = [
(spam_log_v1, ''),
(spam_log_v2, '')]
for fct, setup in tests:
res = timeit.repeat(fct, setup=setup, repeat=repeat, number=number)
print("%s: %d loops, best of %d: %.3g %s per loop" %
(fct.__name__, number, repeat,
min(res) / number * unittosec[unit], unit))