0

假设我有以下声明:

for i in range(10000):
  if i==5:
    do_something_for_5()
  else:
    do_something()

所以你可以看到python需要检查10000次i是否等于5,浪费了9999次检查。我的问题是,有没有什么技巧可以在捕获 5 一次后,python 将绕过 if-checking 并直接转到 exec do_something()?如果检查,有点像整个短路。怎么做?

更多的。.

我不认为是python的问题,你在很多语言中经常看到这样的检查模式。(编译器会优化它?)案例只是为了演示,我只是讨厌看到电脑检查检查检查无果而终想知道避免这种情况的诀窍。它喜欢这样的场景:你知道只有一个坏人,一旦你抓住了这个坏人,你就撤回了警察和安检,让其他人直接过去,这样可以让进程运行得更快。

更通用的代码如下:

for member in member_list:
  if time_consuming_inspect(member)==special_character:#known there is only one candidate match in advance
    do_special_thing(member)
  else:
    do_common_thing(member)
4

4 回答 4

7

做一件直截了当的事情:看到 5 后跳出循环,再运行一个循环完成工作:

for i in range(10000):
    if i==5:
        do_something_for_5()
        break
    else:
        do_something()

for i in range(i+1, 10000):
    do_something()
于 2013-10-06T03:44:06.123 回答
5

一种方法是写这样的东西:

for i in range(4):
    do_something()

do_something_for_5()

for i in range(6, 10000):
    do_something()

如果 5 的特殊情况不需要按顺序执行,那么这将减少重复:

for i in itertools.chain(range(5), range(6, 10000)):
    print i

听起来你真的想要像自我修改代码这样的东西,这样它就不会再做检查了,但我建议不要这样做。额外检查没有太大影响。


对评论的回应

不建议使用以下内容,并且对于此示例来说太过分了,但它确实有效。在检查 5 成功后,它使用不同的功能。请记住,必须查找分配给变量的函数,所以我怀疑速度会有所提高。这可能用途非常有限,但是:

do_something = None

def do_something_with_check(i):
    if i != 5:
        print 'Doing something with check.'
    else:
        do_something_for_5()
        global so_something
        do_something = do_something_without_check

def do_something_without_check(i):
    print 'Doing something without check.'

def do_something_for_5():
    print 'Doing something for 5.'

do_something = do_something_with_check

for i in range(10):
    do_something(i)

打印出来:

Doing something with check.
Doing something with check.
Doing something with check.
Doing something with check.
Doing something with check.
Doing something for 5.
Doing something without check.
Doing something without check.
Doing something without check.
Doing something without check.
于 2013-10-06T03:39:42.080 回答
1
seenFive = False
for i in range(10000):
  if not seenFive and i==5:
    do_something_for_5()
    seenFive = True
  else:
    do_something()
于 2013-10-06T03:38:47.883 回答
0

您不能迭代 5 个以上,并单独执行该功能:

nums = range(10000) # list(range(10000)) on python3
nums.remove(5) # Get rid of 5 from the list.
do_something_for_5()
for i in nums:
    do_something()

我不确定这是否会有所帮助,因为制作列表的开销可能不仅仅是i==5在每次迭代中检查是否。

于 2013-10-06T03:42:01.903 回答