我在一个项目中工作,我有一个功能:
def myMin(L):
current = L[0]
for x in L:
if x < current:
current == x
return current
它非常易读,但效率不高。我怎样才能提高效率?我宁愿不使用min
。
答案 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的递归函数,min
和sorted(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]