2012-04-16 4 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

귀하의 실패 문은 구문이 올바르지 않습니다. 당신은 시간에 필요한 경우 여러 문의는 함수를 정의하고 이제 실패한 문이 docs for Compound Statement

에서

발췌가 잘못된 이유를 이해하는 데 필요한 주요

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

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

에서 기능을 가져온 후, 타이머를 호출

스위트는 헤더의 콜론 다음에 헤더와 같은 행에 하나 이상의 세미콜론으로 구분 된 간단한 명령문이 될 수 있으며 후속 라인에서 하나 이상의 들여 쓰기 명령문이 될 수 있습니다.

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

이 때'입니다'법적 라인 구분자로? –

+3

+1, 나는'n = []'을 별도의 셋업 매개 변수에 넣고 싶지만 타이머 (setup = 'n = []', stmt = 'for range (10) : n.append oct (i)) '). repeat (3)' –

1

당신은뿐만 아니라 triple quotes를 사용할 수 있습니다

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

Timer(statement).repeat(3)