Python语法:在timeit语句中使用循环

Nei*_*aft 3 python timeit

其中两个语句运行而另一个语句因语法错误而失败.我究竟做错了什么?

>>> Timer('for i in xrange(10): oct(i)').repeat(3)
[2.7091379165649414, 2.6934919357299805, 2.689150094985962]
>>> Timer('n = [] ; n = [oct(i) for i in xrange(10)]').repeat(3)
[4.0500171184539795, 3.6979520320892334, 3.701982021331787]
>>> Timer('n = [] ; for i in xrange(10): n.append(oct(i))').repeat(3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/timeit.py", line 136, in __init__
    code = compile(src, dummy_src_name, "exec")
  File "<timeit-src>", line 6
    n = [] ; for i in xrange(10): n.append(oct(i))
               ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

Abh*_*jit 7

您的失败语句在语法上是不正确的.如果需要时间多个语句在函数中定义它并在从main导入函数后调用Timer

>>> def foo():
    n = []
    for i in xrange(10): n.append(oct(i))    

>>> Timer("foo()","from __main__ import foo")
Run Code Online (Sandbox Code Playgroud)

现在您需要了解失败语句的错误原因

摘自复合声明文档

套件可以是与标题位于同一行的一个或多个以分号分隔的简单语句,位于标题的冒号后面,也可以是后续行中的一个或多个缩进语句.

stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
Run Code Online (Sandbox Code Playgroud)

同样,一个简单的陈述

simple_stmt ::=  expression_stmt
                 | assert_stmt
                 | assignment_stmt
                 | augmented_assignment_stmt
                 | pass_stmt
                 | del_stmt
                 | print_stmt
                 | return_stmt
                 | yield_stmt
                 | raise_stmt
                 | break_stmt
                 | continue_stmt
                 | import_stmt
                 | global_stmt
                 | exec_stmt
Run Code Online (Sandbox Code Playgroud)

现在应该清楚你可以(不应该)使用分号.


jam*_*lak 6

Timer('n = []\nfor i in xrange(10): n.append(oct(i))').repeat(3)
[2.026008492408778, 2.065228002189059, 2.048982731136192]
Run Code Online (Sandbox Code Playgroud)

  • +1,虽然我宁愿把`n = []`放到一个单独的设置参数中:`Timer(setup ='n = []',stmt ='for i in range(10):n.append(oct) (ⅰ))').重复(3)` (3认同)
  • 什么时候```合法作为行分隔符? (2认同)