私は長い間 Python のtimeitモジュールを使用してきましたが、それは対話型の Python セッションまたは Unix シェルを介したものにすぎませんでした。現在、Windows コマンド プロンプト ( cmd.exe ) でいくつかのコード スニペットを測定しようとしていますが、次のエラーが表示されます。
C:\Users\Me>python -m timeit '"-".join(map(str, range(100)))'
Traceback (most recent call last):
File "C:\Python33\lib\runpy.py", line 160, in _run_module_as_main
"__main__", fname, loader, pkg_name)
File "C:\Python33\lib\runpy.py", line 73, in _run_code
exec(code, run_globals)
File "C:\Python33\lib\timeit.py", line 334, in <module>
sys.exit(main())
File "C:\Python33\lib\timeit.py", line 298, in main
t = Timer(stmt, setup, timer)
File "C:\Python33\lib\timeit.py", line 131, in __init__
code = compile(src, dummy_src_name, "exec")
File "<timeit-src>", line 6
'-.join(map(str,
^
SyntaxError: EOL while scanning string literal
文字列に改行文字を挿入していないため、かなり紛らわしいです。実際には、 timeit モジュールのドキュメントから直接例を貼り付けました。
これをいじりながら、エラーが直前の文字をマークしたため、スペースなしでスニペットをテストしてみました。pass
例外は発生しなくなりましたが、モジュールは、次のようにステートメントを渡した場合と同じ実行時間を報告します。
C:\Users\Me>python -m timeit
100000000 loops, best of 3: 0.013 usec per loop
C:\Users\Me>python -m timeit 'map(str,range(100))'
100000000 loops, best of 3: 0.013 usec per loop
C:\Users\Me>python -m timeit 'map(str,range(1000000000000000))'
100000000 loops, best of 3: 0.013 usec per loop
同じ行を Unix シェルに貼り付けて期待どおりに動作するので、モジュールを正しく呼び出していると確信しています。
Python 2.7 と 3.3 でまったく同じ結果が得られるので (さらに、モジュールは純粋な Python で記述されており、長い間使用されてきました)、これは Python とは何の関係もないと確信していますが、Windows コマンド プロンプトは、代わりは。
では、なぜこの奇妙な動作が正確に発生し、どのように修正すればよいのでしょうか?