2012-04-16 70 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)