我正在试用python -mtimeit
,所以我放了python -mtimeit "n = 0; while n < 10: pass"
然后出现一个无效语法错误。与分号和for循环相同。
但是,当我分别尝试分号和循环时。两个都很好。
python -c "for i in range(10): print(n)"
python -c "n = 1; n = 2; print(n)"
为什么会这样?我如何在timeit中循环时进行测试?非常感谢!
while
、for
之前不能有分号,它们需要在一行上。如果您查看Python语法:
compound_stmt ::= if_stmt
| while_stmt
| for_stmt
| try_stmt
| with_stmt
| funcdef
| classdef
| decorated
suite ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement ::= stmt_list NEWLINE | compound_stmt
stmt_list ::= simple_stmt (";" simple_stmt)* [";"]
您将看到作为compound_stmt
的一部分的语句需要是单独的一行。唯一可以用分号分隔的语句是simple_stmt
group:
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
timeit
可以采用两个参数:设置代码和时间代码。
python -mtimeit "n = 0" "while n < 10: pass"
此外,您应该将pass
更改为n += 1
,否则您将处于无限循环中。
如果你在脚本中编写它,为什么不像在真正的python程序中那样缩进它呢?像这样:
python -mtimeit "
n = 0
while n < 10:
pass"
选择的答案非常好地解决了为什么,但不是在任何操作系统下如何解决的问题(因为windows cmd不允许多行语句)
答案是:exec
您必须在exec语句中嵌套任何循环。
示例:(Python 2)
python -c "i = 3; while i:print i; i-=1"
是语法错误,而
python -c "i = 3; exec 'while i:print i;i-=1'"
工作正常。
这是一个老话题,但没有人提到列表理解,所以它就在这里。
如果涉及打印,也可以使用带有功能的列表理解:
python2 -m timeit "from pprint import pprint; [pprint(i) for i in range(1000)]"
在python3中,打印本身可以工作,因为与python2不同,它已经是一个函数:
python3 -m timeit "[print(i) for i in range(1000)]"