3

これらのステートメントのうち2つは実行されますが、もう1つは構文エラーで失敗します。私は何が間違っているのですか?

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

3 に答える 3

7

失敗したステートメントは構文的に正しくありません。複数のステートメントの時間を計測する必要がある場合は、関数でそれを定義し、メインから関数をインポートした後にタイマーを呼び出します

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

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

ここで、失敗したステートメントが正しくない理由を理解する必要があります

複合ステートメントのドキュメントからの抜粋

スイートは、ヘッダーのコロンに続く、ヘッダーと同じ行にある1つ以上のセミコロンで区切られた単純なステートメントにすることも、後続の行にある1つ以上のインデントされたステートメントにすることもできます。

stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]

同様に、簡単なステートメント

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

これで、セミコロンをいつ使用できるか(使用しないか)が明確になります。

于 2012-04-16T14:46:19.827 に答える
6
Timer('n = []\nfor i in xrange(10): n.append(oct(i))').repeat(3)
[2.026008492408778, 2.065228002189059, 2.048982731136192]
于 2012-04-16T14:41:57.080 に答える
3

三重引用符も使用できます。

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

Timer(statement).repeat(3)
于 2015-04-26T16:17:36.110 に答える