如何将 timeit 与包含 EOL 字符的命令一起使用?
How can you use timeit with commands containing EOL characters?
我正在尝试学习如何使用 timeit 为由 python 驱动的命令行参数计时。
from subprocess import *
import timeit
p = Popen( ["cmd.exe"], stdin=PIPE, stdout=PIPE )
dir_time = timeit.timeit('p.stdin.write("dir\n"),p.stdin.write("exit\n")')
print p.stdout.read()
不幸的是,当我 运行 我得到
"exceptions.SyntaxError: EOL while scanning string literal (line 6, offset 26): 'p.stdin.write(""dir'"
我见过 similar question about EOL syntax error when using timeit and cmd 它的解决方案是替换单引号但是我没有将代码片段直接输入 cmd,它们的命令从不包含结束行字符并且双引号产生语法错误。
有什么方法可以分隔行尾字符但在cmd中仍然有效吗?我在 timeit 中对两个参数使用了不正确的语法吗?
要解决 EOL 的直接问题,您可以使用原始字符串文字:r'p.stdin.write("dir\n"),..'
(注意:r''
)否则 \n
将被解释为导致错误的换行符你看:
>>> import timeit
>>> timeit.timeit('"a" + "\n"')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/timeit.py", line 230, in timeit
return Timer(stmt, setup, timer).timeit(number)
File "/usr/lib/python2.7/timeit.py", line 136, in __init__
code = compile(src, dummy_src_name, "exec")
File "<timeit-src>", line 6
"a" + "
^
SyntaxError: EOL while scanning string literal
对比
>>> timeit.timeit(r'"a" + "\n"')
0.021812915802001953
更普遍的问题是:
timeit(r'p.stdin.write("dir\n"),p.stdin.write("exit\n")')
不行
p
可能无法访问 (NameError
)
即使它起作用了,它也不会测量在 cmd.exe
中执行 运行 dir
命令所需的时间
它将测量将命令写入内部 python
文件缓冲区需要多长时间 and/or 通过管道将其推送到 cmd.exe
否则会加注 IOError/OSError
管道可能在exit
第一次执行后关闭。
timeit
运行s 代码多次(默认为 1000000)。
看起来像XY problem。如果您想知道如何测量运行 cmd.exe
中的内部命令所花费的时间,那么直接将其作为一个新问题询问。
timeit
不是合适的工具。
我正在尝试学习如何使用 timeit 为由 python 驱动的命令行参数计时。
from subprocess import *
import timeit
p = Popen( ["cmd.exe"], stdin=PIPE, stdout=PIPE )
dir_time = timeit.timeit('p.stdin.write("dir\n"),p.stdin.write("exit\n")')
print p.stdout.read()
不幸的是,当我 运行 我得到
"exceptions.SyntaxError: EOL while scanning string literal (line 6, offset 26): 'p.stdin.write(""dir'"
我见过 similar question about EOL syntax error when using timeit and cmd 它的解决方案是替换单引号但是我没有将代码片段直接输入 cmd,它们的命令从不包含结束行字符并且双引号产生语法错误。
有什么方法可以分隔行尾字符但在cmd中仍然有效吗?我在 timeit 中对两个参数使用了不正确的语法吗?
要解决 EOL 的直接问题,您可以使用原始字符串文字:r'p.stdin.write("dir\n"),..'
(注意:r''
)否则 \n
将被解释为导致错误的换行符你看:
>>> import timeit
>>> timeit.timeit('"a" + "\n"')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/timeit.py", line 230, in timeit
return Timer(stmt, setup, timer).timeit(number)
File "/usr/lib/python2.7/timeit.py", line 136, in __init__
code = compile(src, dummy_src_name, "exec")
File "<timeit-src>", line 6
"a" + "
^
SyntaxError: EOL while scanning string literal
对比
>>> timeit.timeit(r'"a" + "\n"')
0.021812915802001953
更普遍的问题是:
timeit(r'p.stdin.write("dir\n"),p.stdin.write("exit\n")')
不行p
可能无法访问 (NameError
)即使它起作用了,它也不会测量在
中执行 运行cmd.exe
dir
命令所需的时间它将测量将命令写入内部
python
文件缓冲区需要多长时间 and/or 通过管道将其推送到cmd.exe
否则会加注 IOError/OSError
管道可能在
exit
第一次执行后关闭。timeit
运行s 代码多次(默认为 1000000)。
看起来像XY problem。如果您想知道如何测量运行 cmd.exe
中的内部命令所花费的时间,那么直接将其作为一个新问题询问。
timeit
不是合适的工具。