首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >timeit.timeit方法错误“期望一个缩进块”

timeit.timeit方法错误“期望一个缩进块”
EN

Stack Overflow用户
提问于 2017-01-07 21:20:25
回答 2查看 615关注 0票数 0

由于我正在学习Python3.5,我想开始比较不同代码上的时间。我在其他几个简单的语句上尝试了timeit.timeit模块,并使其工作起来。

我无法让它在下面的代码中工作,并得到下面的错误:

代码语言:javascript
复制
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"""

我使用的代码是:

代码语言:javascript
复制
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关键字,但没有任何效果。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-07 21:30:17

您必须在timeit调用中将python代码作为字符串传递。

传递要执行的表达式(#TOTWBA,#TOTBUR,#TOTSOU,#WBATOT,#WBABUR,#WBASOU,#BURTOT,#BURWBA,#BURSOU,#SOUTOT,#SOUWBA,#SOUBUR)的计算值。

此外,您必须按照字面意思传递listTags,或者使用setup表达式,因为timeit在不同的解释器中运行:它不知道您以前定义的变量。

我重写了第一次使用单引号来保护语句的调用,并添加了一个setup调用来定义listTags变量。

代码语言:javascript
复制
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:它起作用了

票数 2
EN

Stack Overflow用户

发布于 2017-01-07 21:37:39

@Jean是正确的,您需要将它作为字符串传递给timeit (用单引号'包装它),这样它才能正确工作。您还需要传递适当的setup以使名称查找成功。

然而,值得注意的是,为什么会发生这种情况。

当您尝试并使用timeit时:

代码语言:javascript
复制
print(timeit.timeit(",".join(["#" + "".join(t) for t in itertools.permutations(listTags, 2)]))

你应该意识到这个论点是被评估的。timeit最终通过以下参数被调用:

代码语言:javascript
复制
timeit.timeit('#TOTWBA,#TOTBUR,#TOTSOU,#WBATOT,#WBABUR,#WBASOU,#BURTOT,#BURWBA,#BURSOU,#SOUTOT,#SOUWBA,#SOUBUR')

timeit内部,它被格式化为一个默认的模板,该模板会被计时;很容易重新创建该模板,以查看Python试图执行什么:

代码语言:javascript
复制
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的问题是:

代码语言:javascript
复制
>>> 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循环的正文中只有一个注释(在解析过程中被删除)。执行:

代码语言:javascript
复制
for i in [1, 2]:
    # foo
print('fooing')

在以下方面的成果:

代码语言:javascript
复制
  File "<ipython-input-58-634beff715a1>", line 3
    print('fooing')
        ^
IndentationError: expected an indented block
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41526682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档