2012-04-24 42 views
8

使用分號我似乎無法得到timeit.timeit上班的時候我在作爲字符串傳遞的聲明的說法例外:內timeit

# after the first and third semicolon, I put 4 spaces 
timeit.timeit('try:; a=1;except:; pass') 

這導致:

Traceback (most recent call last): 
    File "a.py", line 48, in <module> 
    timeit.timeit('try:; a=1;except:; pass') 
    File "C:\CPython33\lib\timeit.py", line 230, in timeit 
    return Timer(stmt, setup, timer).timeit(number) 
    File "C:\CPython33\lib\timeit.py", line 136, in __init__ 
    code = compile(src, dummy_src_name, "exec") 
    File "<timeit-src>", line 6 
    try:; a=1;except:; pass 
     ^
SyntaxError: invalid syntax 

我使用Python 3.3運行它,但即使使用舊的Python(3.2)也會發生同樣的錯誤。

UPDATE:

我以下this documentation(重點煤礦):

類timeit.Timer(語句= '通',設定= '通過',計時器=)

類用於小代碼片段的定時執行速度。

該構造函數需要一個語句定時,一個額外的語句 用於設置和一個計時器功能。兩條語句默認爲 'pass';定時器功能與平臺有關(請參閱模塊doc 字符串)。 stmt和安裝程序可能還包含多個語句分隔 由;或換行符,只要它們不包含多行字符串 文字。

回答

19

您需要提供帶有換行符的正確縮進代碼,而不是分號。嘗試將其更改爲以下:

timeit.timeit('try:\n a=1\nexcept:\n pass') 

雖然這可能是更具可讀性爲:

stmt = '''\ 
try: 
    a=1 
except: 
    pass''' 
timeit.timeit(stmt) 

分號將正常分離,將具有相同的縮進級別的語句,但任何空格或製表符你放在分號和下一個語句之間將被忽略,所以你不能用縮進來使用它們。

+0

謝謝你..你可以請檢查更新的問題:使用textwrap允許代碼縮進的基礎水平,提高可讀性另一種選擇?實際上'timeit.timeit('a = 1; b = 1')'可以正常工作...... – max 2012-04-24 16:28:17

+0

@max - 分號可以很好地用於分隔具有相同縮進級別的語句,但是可以使用任何空格或製表符分號和下一個語句之間的內容將被忽略,因此您不能使用它們進行縮進。 – 2012-04-24 16:29:45

+0

@max,';'不適用於try/except,for循環,while循環,if塊等等。它只適用於分隔簡單的語句。 – 2012-04-24 16:29:46

0

這是一箇舊線程,但它可能值得更新。

import timeit 
import textwrap 
print(timeit.timeit(textwrap.dedent(""" 
    try: 
    a=1 
    except: 
    pass 
    """), number=10)) 
相關問題