-3

我在一个项目中工作,我有一个功能:

def myMin(L):
    current = L[0]
    for x in L:
        if x < current:
            current == x
    return current

它可读性很强,但效率不高。我怎样才能使它更有效率?我宁愿不使用min.

4

2 回答 2

1

这不是低效,只是不正确。你有一个==你需要的地方=

current = x
于 2013-07-08T03:12:52.080 回答
0

我没有使用min,这只会比min.

def myMin(L):
    L = [i * -1 for i in L]
    return max(L)*-1

不过说真的,min可能足够有效。

编辑:可能是没有min的最有效的方法,令人惊讶的是 OPs 代码,但sorted(L)[0]也很接近。但是,我假设解释器正在对 OP 代码进行一些优化,或者可能只是将其直接转换为min().

这显示了 4 种方法的运行时间、OP、Sergio 的递归函数minsorted(L)[0]

import timeit
import random


t = timeit.Timer(
stmt="min([random.randint(0,100) for r in xrange(100)])",
setup="import random")
print "min(L) \t\t-", t.repeat(number=10000)

t = timeit.Timer(
stmt="sorted([random.randint(0,100) for r in xrange(100)])[0]",
setup="import random")
print "sorted(L)[0] \t-", t.repeat(number=10000)

t = timeit.Timer(
stmt="myMin([random.randint(0,100) for r in xrange(100)])",
setup="""import random
def myMin(L):
    if len(L)==1:
        return L[0]
    else:
        half=len(L)/2
        if myMin(L[half:])<=myMin(L[:half]):
            return myMin(L[half:])
        else:
            return myMin(L[:half])"""
)

print "Sergio \t\t-", t.repeat(number=10000)

t = timeit.Timer(
stmt="myMin([random.randint(0,100) for r in xrange(100)])",
setup="""import random
def myMin(L):
    current = L[0]
    for x in L:
        if x < current:
            current == x
    return current
"""
)
print "OP \t\t-", t.repeat(number=10000)

结果:

>>> min(L)          - [1.3573479652404785, 1.3553318977355957, 1.3567471504211426]
>>> sorted(L)[0]    - [1.4576461315155029, 1.4571821689605713, 1.4570169448852539]
>>> Sergio          - [8.265916109085083, 8.2540609836578369, 8.2737438678741455]
>>> OP              - [1.4068629741668701, 1.4091939926147461, 1.4070329666137695]
于 2013-07-08T03:19:56.427 回答