2013-07-08 2 views
-3

Я работаю в проекте, и у меня есть функция:Finding эффективное решение в Python

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

Это очень читаемый, но не так эффективно. Как я могу сделать его более эффективным? Я бы предпочел не использовать min.

+0

Принадлежит на Http: // Просмотр Кода. stackexchange.com/. Кроме того, вы имели в виду 'current = x'? – TerryA

+0

Как это не эффективно, кроме проблемы с текущим = x, ваш код O (n), который наилучшим образом подходит для него. Если вы хотите делать вставки, удаления и повторяющиеся «минимальные» результаты, вам может потребоваться найти несколько структур данных, которые обеспечивают O (1) амортизированное время. –

+0

Это не кажется неэффективным. Он не может использовать меньшее количество шагов (ну, у вас может быть меньше сравнения), и трудно понять, как каждый шаг может быть намного быстрее. Что вы пытаетесь сделать, это должно быть быстрее? Использование встроенного модуля, вероятно, будет наиболее эффективным способом. Почему вы не можете использовать его? –

ответ

1

Это неэффективно, просто неверно. У вас есть ==, где вам нужен =.

current = x 
+0

Приносим извинения всем тем, кто указал на это в комментариях, я их не видел. –

+0

Спасибо, что указали, что, но я хотел бы найти другое решение, более эффективное, если бы это было возможно – Merck

+2

@ Zipp, почему, по вашему мнению, возможно более эффективное решение? И почему вы не можете использовать более эффективное решение, которое уже предлагает Python? –

0

Я не использовал 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] 
+0

Кроме того, max (L) [- 1] будет делать то же самое;) –

Смежные вопросы