6

我正在尝试,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 循环?非常感谢!

4

5 回答 5

11

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_stmtgroup:

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
于 2013-09-03T22:34:32.257 回答
3

timeit可以带两个参数:设置码和时间码。

python -mtimeit "n = 0" "while n < 10: pass"

此外,您应该将其更改pass为,n += 1否则您将处于无限循环中。

于 2013-09-04T00:04:31.910 回答
1

如果您在脚本中编写它,为什么不像在真正的 python 程序中那样缩进它呢?像这样:

python -mtimeit "
n = 0
while n < 10:
    pass"
于 2013-09-03T21:57:41.050 回答
1

选定的答案很好地解决了为什么,但不是如何在任何操作系统下解决这个问题(因为 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'"

工作正常。

于 2017-12-13T21:51:33.407 回答
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)]"
于 2021-11-28T14:06:13.513 回答