如何在包含EOL字符的命令中使用timeit?

时间:2015-04-02 04:08:10

标签: python windows cmd 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扫描字符串文字时(第6行,偏移26):' p.stdin.write('" dir'"

我看过similar question about EOL syntax error when using timeit and cmd并且它的解决方案是替换单引号但是我没有直接将代码段提供给cmd,它们的命令从不包含终点字符它和双引号会产生语法错误。

有没有办法划分行尾字符但仍然在cmd中有效?我是否在timeit中使用了两个参数的错误语法?

1 个答案:

答案 0 :(得分:1)

要修复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

VS

>>> timeit.timeit(r'"a" + "\n"')
0.021812915802001953

更普遍的问题是:

  • timeit(r'p.stdin.write("dir\n"),p.stdin.write("exit\n")')无法工作

    p可能无法访问(NameError

  • 即使有效,也无法衡量在dir

    中运行cmd.exe命令所需的时间

    它会测量将命令写入内部python文件缓冲区和/或将其通过管道推送到cmd.exe

  • 所需的时间
  • 或者它会引发IOError / OSError

    管道可能在第一次执行exit后关闭。 timeit多次运行代码(默认为1000000)。

看起来像XY problem。如果您想知道如何衡量在cmd.exe中运行内部命令所需的时间,那么请直接将其作为一个新问题询问。

timeit不适合此处。