2012-02-23 15 views
6

Una pregunta rápida, lo que es más eficiente para encontrar el número más pequeño (float) en una larga lista (10000 + elementos)forma más eficiente de encontrar el flotador mínimo de una lista de pitón

es que

min(mylist) 

o

mylist.sort() 

y luego regresar

mylist[0] 

o algo más ...

gracias!

+4

Voy a darme cuenta de que 'min' no solo sería semánticamente más preciso, sino que probablemente se implementará de manera más eficiente ya que Python sabrá qué hacer, y' sort() 'puede no ser lo mejor que hacer. –

+0

Además, consulte http://stackoverflow.com/questions/2289053/fast-way-to-get-n-min-or-max-elements-from-a-list-in-python para obtener un duplicado –

+1

Was 'timeit '¿roto? Esto parece una gran oportunidad para mostrar los resultados de 'timeit'. ¿Por qué no publicaste los resultados 'timeit'? –

Respuesta

10

Si la lista ya está completa, min() es la forma más eficiente.

Hay algunos trucos que puedes usar en escenarios especiales:

  • Si se construye la lista desde cero, simplemente mantener el elemento más pequeño sin embargo, en una variable externa, por lo que la respuesta será dada en O(1).
  • Si solo hay flotadores en la lista, use un Array que le da un mejor rendimiento.
  • Puede mantener la lista ordenada usando bisect.
  • Utilice un Python Heap, que incluso tiene una implementación eficiente de min(). Asegúrese de comprender los efectos, principalmente una inserción más lenta. (credit: interjay)
+1

gracias por las respuestas a todos - muy útil. Pensándolo bien, me he dado cuenta de que no necesito mantener todos los valores para hacer la búsqueda final de los más bajos. Todo lo que necesito es comparar el valor actual en el ciclo con el mínimo y hacer un poco de tipo 'si es user1228368

+1

@ user1228368: Debería [aceptar esta respuesta] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) - haga clic en la marca de verificación a la izquierda. – DSM

+0

debidamente anotado! ¡Gracias! – user1228368

2

Bueno, definitivamente tiene que iterar sobre toda la lista, por lo que su tiempo de ejecución debe ser O (n).

Como una ordenación ya lleva tiempo O (n log n), obviamente esta no es la mejor manera de hacerlo. No sé la implementación de min(), pero debería ser la forma correcta de hacerlo.

11

Frst, si se preocupan por el rendimiento en Python (que no siempre es una cosa sensible a preocuparse, pero eso es otra conversación), usted debe utilizar el timeit module. Incluso en C es difícil predecir cómo se comportarán ciertas funciones después de la compilación, y es más difícil en Python. Con frecuencia, las personas expresan con confianza opiniones sobre qué funciones son más rápidas y cuáles dependen de los datos. Entonces, al usar timeit, quiero decir, podrías haberlo descubierto tú mismo.

En segundo lugar, si realmente se preocupan por el rendimiento en las listas de flotadores, no debe usar listas en absoluto, sino matrices numpy. Usando IPython aquí, en Python 2.7.2, lo que hace que el tiempo sea más fácil:

In [41]: import random, numpy 
In [42]: a = [0.1*i for i in range(10**5)] 
In [43]: timeit min(a) 
100 loops, best of 3: 4.55 ms per loop 
In [44]: timeit sorted(a)[0] 
100 loops, best of 3: 4.57 ms per loop 
In [45]: random.shuffle(a) 
In [46]: timeit min(a) 
100 loops, best of 3: 6.06 ms per loop 
In [47]: timeit min(a) # to make sure it wasn't a fluke 
100 loops, best of 3: 6.07 ms per loop 
In [48]: timeit sorted(a)[0] 
10 loops, best of 3: 65.9 ms per loop 
In [49]: b = numpy.array(a) 
In [50]: timeit b.min() 
10000 loops, best of 3: 97.5 us per loop 

Y observamos algunas cosas. (1) El género de Python (timsort) funciona muy bien en los datos que tienen corridas ordenadas, por lo que ordenar una lista ya ordenada casi no tiene penalización. (2) La clasificación de una lista aleatoria, por otro lado, es mucho más lenta, y esto solo empeorará a medida que los datos crezcan. (3) Numpy.min() en una matriz flotante funciona sesenta veces más rápido que min en una lista de Python, porque no tiene que ser tan general.

+0

+1 Esa es la mejor respuesta si el desarrollador controla la construcción de la lista (en lugar de obtener un identificador como entrada) –

Cuestiones relacionadas