我正在尝试,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 循环?非常感谢!
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 语句中嵌套任何循环。
示例:(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 中 print 本身可以工作,因为与 python2 不同,它已经是一个函数:
python3 -m timeit "[print(i) for i in range(1000)]"