Я не использовал min
и это будет только немного медленнее, чем min
.
def myMin(L):
L = [i * -1 for i in L]
return max(L)*-1
Серьезно, однако, min
, вероятно, достаточно эффективен.
редактировать: Вероятно, наиболее эффективным вы собираетесь получить без мин, удивительно код ФОС, но sorted(L)[0]
близко, как хорошо. Тем не менее, я бы предположил, что интерпретатор делает некоторую оптимизацию по коду OPs или, возможно, просто преобразует его непосредственно в min()
.
Это показывает время выполнения 4 подходов, вуп, рекурсивной функцией от 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]
Принадлежит на Http: // Просмотр Кода. stackexchange.com/. Кроме того, вы имели в виду 'current = x'? – TerryA
Как это не эффективно, кроме проблемы с текущим = x, ваш код O (n), который наилучшим образом подходит для него. Если вы хотите делать вставки, удаления и повторяющиеся «минимальные» результаты, вам может потребоваться найти несколько структур данных, которые обеспечивают O (1) амортизированное время. –
Это не кажется неэффективным. Он не может использовать меньшее количество шагов (ну, у вас может быть меньше сравнения), и трудно понять, как каждый шаг может быть намного быстрее. Что вы пытаетесь сделать, это должно быть быстрее? Использование встроенного модуля, вероятно, будет наиболее эффективным способом. Почему вы не можете использовать его? –