我在一个项目中工作,我有一个功能:
def myMin(L):
current = L[0]
for x in L:
if x < current:
current == x
return current
它可读性很强,但效率不高。我怎样才能使它更有效率?我宁愿不使用min
.
我在一个项目中工作,我有一个功能:
def myMin(L):
current = L[0]
for x in L:
if x < current:
current == x
return current
它可读性很强,但效率不高。我怎样才能使它更有效率?我宁愿不使用min
.
这不是低效,只是不正确。你有一个==
你需要的地方=
。
current = x
我没有使用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 的递归函数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]