10

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)でも同じ間違いが発生します。

アップデート:

私はこのドキュメントに従っていました(私の強調):

class timeit.Timer(stmt ='pass'、setup ='pass'、timer =)

小さなコードスニペットの実行速度のタイミングのクラス。

コンストラクターは、タイミングをとるステートメント、セットアップに使用される追加のステートメント、およびタイマー関数を受け取ります。どちらのステートメントもデフォルトで「pass」になっています。タイマー機能はプラットフォームに依存します(モジュールのドキュメント文字列を参照)。stmtとsetupには、;で区切られた複数のステートメントが含まれる場合もあります。または改行(複数行の文字列リテラルが含まれていない場合)。

4

2 に答える 2

23

セミコロンではなく、改行を使用して適切にインデントされたコードを提供する必要があります。次のように変更してみてください。

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

これは次のように読みやすくなりますが:

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

セミコロンは、同じインデントレベルを持つステートメントを区切るために正常に機能しますが、セミコロンと次のステートメントの間に配置したスペースまたはタブは無視されるため、インデントで使用することはできません。

于 2012-04-24T16:22:48.373 に答える
0

これは古いスレッドですが、更新する価値があるかもしれません。textwrapを使用して、コードに基本レベルのインデントを許可することで読みやすさを向上させる別のオプション:

import timeit
import textwrap
print(timeit.timeit(textwrap.dedent("""
  try:
    a=1
  except:
    pass
  """), number=10))
于 2017-10-23T22:23:19.297 に答える