[英]Python timeit NameError
我想在Python 3.5中使用timeit來測量兩個函數。 第一個依賴於import math
,第二個依賴from math import log2
。 我雖然可以通過在調用timeit.repeat
時將適當的import語句作為設置字符串傳遞來處理這個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))
由timeit.repeat
運行的inner
函數如下所示:
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
和/或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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.