2012-04-16 73 views
1

其中两个语句运行,另一个语句运行失败并出现语法错误。我究竟做错了什么?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 

回答

6

你失败的说法是语法不正确。如果您需要的时间多语句的一个函数定义,并呼叫计时器,从主

>>> 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 

现在应该很清楚什么时候可以(不应该)使用一个分号。

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

时候','的法律作为一个行分隔符? – 2012-04-16 14:45:55

+3

+1,尽管我宁愿将'n = []'放入一个单独的设置参数中:'Timer(setup ='n = []',stmt ='for i in range(10):n.append辛(ⅰ))')。重复(3)' – 2012-04-16 14:46:07

1

您可以使用triple quotes还有:

statement = '''n = [] 
for i in xrange(10): 
    n.append(oct(i))''' 

Timer(statement).repeat(3)