在Python中寻找有效的解决方案

时间:2013-07-08 02:50:15

标签: python performance

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

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

它非常易读,但效率不高。我怎样才能提高效率?我宁愿不使用min

2 个答案:

答案 0 :(得分:1)

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

current = x

答案 1 :(得分:0)

我没有使用min,这只会比min慢一点。

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

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

编辑: 可能效率最高的是没有 min,令人惊讶的是OP代码,但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]