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

时间:2012-04-16 14:36:56

标签: 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

3 个答案:

答案 0 :(得分:7)

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

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

>>> Timer("foo()","from __main__ import foo")

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

摘自docs for Compound Statement

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

stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]

同样地,simple statement

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

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

答案 1 :(得分:6)

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

答案 2 :(得分:3)

您也可以使用triple quotes

data.table