he encontrado una solución que me da un orden aleatorio de los archivos :) (al menos yo no puedo ver un patrón)
En primer lugar he encontrado this post in the python maillist. Hay 3 archivos adjuntos que debe copiar en su disco (opendir.pyx, setup.py, test.py
). A continuación, necesita el paquete python Pyrex para compilar el archivo opendir.pyx
desde la publicación. Tuve problemas para instalar Pyrex y descubrí que tenía que instalar python-dev
a través de apt-get
. Luego instalé el paquete opendir
de los tres archivos descargados anteriormente con python setup.py install
. El archivo test.py
contiene ejemplos de cómo usarlo.
Siguiente Me interesaba saber cuánto más rápida sería esta solución que usar os.listdir y crear 200000 archivos con el siguiente shellscript pequeño.
for((i=0; i<200000; i++))
do
touch $i
done
El siguiente script es mi punto de referencia que se ejecuta en el directorio en el que acabo de crear los archivos:
from opendir import opendir
from timeit import Timer
import os
def list_first_fast(i):
d=opendir(".")
filenames=[]
for _ in range(i):
name = d.read()
if not name:
break
filenames.append(name)
return filenames
def list_first_slow(i):
return os.listdir(".")[:i]
if __name__ == '__main__':
t1 = Timer("list_first_fast(100)", "from __main__ import list_first_fast")
t2 = Timer("list_first_slow(100)", "from __main__ import list_first_slow")
print "With opendir: ", t1.repeat(5, 100)
print "With os.list: ", t2.repeat(5, 100)
La salida en mi sistema es:
With opendir: [0.045053958892822266, 0.04376697540283203, 0.0437769889831543, 0.04387712478637695, 0.04404592514038086]
With os.list: [9.50291895866394, 9.567682027816772, 9.865844964981079, 13.486984968185425, 9.51977801322937]
Como se puede ver que obtuve una aceleración de un factor de 200 al devolver una lista con 100 nombres de archivos de los 200000, eso es bastante agradable :).
Espero que este sea el objetivo que está tratando de lograr.
Esto podría ser útil: http://www.olark.com/spw/2011/08/you-can-list-a-directory-with-8-million-files-but-not-with-ls/ – Kev
¡Aseado! No lo sabía. –
¿Es importante el orden? –