timeit.timeit 方法错误 "expected an indented block"
timeit.timeit method error "expected an indented block"
因为我正在学习 Python 3.5,所以我想开始比较不同代码的时间。
我已经在其他几个简单的语句上尝试了 timeit.timeit
模块并让它工作。
我无法让它在下面的代码上运行并得到以下错误:
Traceback (most recent call last):
File "C:\Users\ASUS\Desktop\pythoncode\class_gen.py", line 10, in <module>
print(timeit.timeit(",".join(["#"+i+j for i in listTags for j in listTags if i != j])))
File "C:\Python35\lib\timeit.py", line 213, in timeit
return Timer(stmt, setup, timer, globals).timeit(number)
File "C:\Python35\lib\timeit.py", line 133, in __init__
code = compile(src, dummy_src_name, "exec")
File "<timeit-src>", line 7
_t1 = _timer()
^
IndentationError: expected an indented block"""
我使用的代码是:
import itertools
import timeit
listTags = [ "TOT" , "WBA", "BUR", "SOU"]
print(timeit.timeit(",".join(["#" + "".join(t) for t in itertools.permutations(listTags, 2)]))
print(timeit.timeit(",".join(["#"+i+j for i in listTags for j in listTags if i != j])))
我试过使用和不使用 number=number
关键字都无济于事。
您必须在 timeit
调用中将 python 代码 作为字符串 传递。
您正在传递要执行的表达式 (#TOTWBA,#TOTBUR,#TOTSOU,#WBATOT,#WBABUR,#WBASOU,#BURTOT,#BURWBA,#BURSOU,#SOUTOT,#SOUWBA,#SOUBUR
) 的 已计算 值。
此外,您必须按字面意思或使用 setup
表达式传递 listTags
,因为 timeit
在不同的解释器中运行:它不知道您之前定义的变量。
我使用单引号重写了第一次调用以保护您的语句,并添加了一个 setup
调用来定义 listTags
变量。
import itertools
import timeit
print(timeit.timeit('",".join(["#" + "".join(t) for t in itertools.permutations(listTags, 2)])',setup='listTags = [ "TOT" , "WBA", "BUR", "SOU"]'))
结果我得到了一个时间:5.2231671576142285
:它正在工作
@Jean 是正确的,您需要将其作为字符串传递给 timeit
(用单引号括起来 '
)才能使其正常工作。您还需要传递适当的 setup
才能使名称查找成功。
尽管如此,有趣的是要注意为什么会发生这种情况。
当您尝试 timeit
时:
print(timeit.timeit(",".join(["#" + "".join(t) for t in itertools.permutations(listTags, 2)]))
你应该意识到参数得到了评估。 timeit
最终使用以下参数调用:
timeit.timeit('#TOTWBA,#TOTBUR,#TOTSOU,#WBATOT,#WBABUR,#WBASOU,#BURTOT,#BURWBA,#BURSOU,#SOUTOT,#SOUWBA,#SOUBUR')
在timeit
中,这被格式化为一个默认的模板;重新创建该模板以查看 Python 尝试执行的内容很容易:
template = """
def inner(_it, _timer{init}):
{setup}
_t0 = _timer()
for _i in _it:
{stmt}
_t1 = _timer()
return _t1 - _t0
"""
src = template.format(stmt=",".join(["#"+i+j for i in listTags for j in listTags if i != j]), setup='', init='')
所以,得到 exec
评价的是:
>>> print(src)
def inner(_it, _timer):
_t0 = _timer()
for _i in _it:
#TOTWBA,#TOTBUR,#TOTSOU,#WBATOT,#WBABUR,#WBASOU,#BURTOT,#BURWBA,#BURSOU,#SOUTOT,#SOUWBA,#SOUBUR
_t1 = _timer()
return _t1 - _t0
如果您尝试在 REPL 中正常执行,将导致 IndentationError
,因为 for
循环在其主体中只有注释(在解析期间被删除)。正在执行:
for i in [1, 2]:
# foo
print('fooing')
结果:
File "<ipython-input-58-634beff715a1>", line 3
print('fooing')
^
IndentationError: expected an indented block
因为我正在学习 Python 3.5,所以我想开始比较不同代码的时间。
我已经在其他几个简单的语句上尝试了 timeit.timeit
模块并让它工作。
我无法让它在下面的代码上运行并得到以下错误:
Traceback (most recent call last):
File "C:\Users\ASUS\Desktop\pythoncode\class_gen.py", line 10, in <module>
print(timeit.timeit(",".join(["#"+i+j for i in listTags for j in listTags if i != j])))
File "C:\Python35\lib\timeit.py", line 213, in timeit
return Timer(stmt, setup, timer, globals).timeit(number)
File "C:\Python35\lib\timeit.py", line 133, in __init__
code = compile(src, dummy_src_name, "exec")
File "<timeit-src>", line 7
_t1 = _timer()
^
IndentationError: expected an indented block"""
我使用的代码是:
import itertools
import timeit
listTags = [ "TOT" , "WBA", "BUR", "SOU"]
print(timeit.timeit(",".join(["#" + "".join(t) for t in itertools.permutations(listTags, 2)]))
print(timeit.timeit(",".join(["#"+i+j for i in listTags for j in listTags if i != j])))
我试过使用和不使用 number=number
关键字都无济于事。
您必须在 timeit
调用中将 python 代码 作为字符串 传递。
您正在传递要执行的表达式 (#TOTWBA,#TOTBUR,#TOTSOU,#WBATOT,#WBABUR,#WBASOU,#BURTOT,#BURWBA,#BURSOU,#SOUTOT,#SOUWBA,#SOUBUR
) 的 已计算 值。
此外,您必须按字面意思或使用 setup
表达式传递 listTags
,因为 timeit
在不同的解释器中运行:它不知道您之前定义的变量。
我使用单引号重写了第一次调用以保护您的语句,并添加了一个 setup
调用来定义 listTags
变量。
import itertools
import timeit
print(timeit.timeit('",".join(["#" + "".join(t) for t in itertools.permutations(listTags, 2)])',setup='listTags = [ "TOT" , "WBA", "BUR", "SOU"]'))
结果我得到了一个时间:5.2231671576142285
:它正在工作
@Jean 是正确的,您需要将其作为字符串传递给 timeit
(用单引号括起来 '
)才能使其正常工作。您还需要传递适当的 setup
才能使名称查找成功。
尽管如此,有趣的是要注意为什么会发生这种情况。
当您尝试 timeit
时:
print(timeit.timeit(",".join(["#" + "".join(t) for t in itertools.permutations(listTags, 2)]))
你应该意识到参数得到了评估。 timeit
最终使用以下参数调用:
timeit.timeit('#TOTWBA,#TOTBUR,#TOTSOU,#WBATOT,#WBABUR,#WBASOU,#BURTOT,#BURWBA,#BURSOU,#SOUTOT,#SOUWBA,#SOUBUR')
在timeit
中,这被格式化为一个默认的模板;重新创建该模板以查看 Python 尝试执行的内容很容易:
template = """
def inner(_it, _timer{init}):
{setup}
_t0 = _timer()
for _i in _it:
{stmt}
_t1 = _timer()
return _t1 - _t0
"""
src = template.format(stmt=",".join(["#"+i+j for i in listTags for j in listTags if i != j]), setup='', init='')
所以,得到 exec
评价的是:
>>> print(src)
def inner(_it, _timer):
_t0 = _timer()
for _i in _it:
#TOTWBA,#TOTBUR,#TOTSOU,#WBATOT,#WBABUR,#WBASOU,#BURTOT,#BURWBA,#BURSOU,#SOUTOT,#SOUWBA,#SOUBUR
_t1 = _timer()
return _t1 - _t0
如果您尝试在 REPL 中正常执行,将导致 IndentationError
,因为 for
循环在其主体中只有注释(在解析期间被删除)。正在执行:
for i in [1, 2]:
# foo
print('fooing')
结果:
File "<ipython-input-58-634beff715a1>", line 3
print('fooing')
^
IndentationError: expected an indented block