Comparativa de sistemas de persistencia en Python

En uno de los proyectos Python en los que he estado trabajando en Emergya, detectamos la necesidad de cambiar el sistema de persistencia bsddb por algún otro que fuera más rápido. Alejandro «CuasiInfinito» Leiva me pidió diseñar un comparador de sistemas de persistencia con el estado del arte actual. Este comparador es el que ocupa esta nueva entrada en el blog.

¿Qué sistemas de persistencia se evalúan?

Los sistemas de persistencia a evaluar en rendimiento son los siguientes:

  • bsddb
  • durus
  • ZODB
  • Redis
  • PyTables

¿Qué pruebas se utilizan para medir el rendimiento?

La primera prueba para cada sistema de persistencia consiste en tomar un fichero CSV línea a línea y utilizar la operación de escritura persistente proporcionada por el sistema que se está evaluando. Es importante el hecho de que esta escritura sea persistente, uno de los errores que cometí de inicio fue pensar que unos sistemas eran más rápidos que otros sin apreciar que estaban realizando la escritura en memoria directa. Para asegurar este punto, cerraremos el manejador de datos de cada sistema una vez hayamos realizado la escritura persistente del fichero CSV completo.

A continuación, creamos un nuevo manejador y leemos los datos almacenados por el sistema de persistencia. Estos datos deben coincidir con los del CSV línea a línea.

Ambas pruebas serán medidas con una marca de tiempo al inicio y al final del proceso. Se realiza una impresión por pantalla del tiempo consumido en cada prueba por parte de cada sistema de persistencia.

¿Dónde descargo el código?

El código puede descargarse de mi cuenta en BitBucket: https://bitbucket.org/jialvarez/persystems/

¿Cómo está estructurado el código?

El código consta de un programa principal que carga el backend escogido y realiza las dos pruebas descritas en un punto anterior. Las operaciones descritas en cada backend son las siguientes:

  • __init__
  • Inicialización del backend dependiendo de la prueba a ejecutar (lectura o escritura).

  • __setitem__
  • Asignación de un elemento de manera persistente.

  • __getitem__
  • Recuperación de un elemento.

  • __len__
  • Número de elementos almacenados por el sistema persistente.

  • first
  • Devuelve el primer elemento de los almacenados de forma persistente.

  • iteritems
  • Itera a través de los elementos almacenados de forma persistente devolviendo un elemento en cada iteración. No implementado aún en todos los backends.

  • close
  • Cierra y/o destruye el manejador del sistema persistente.

  • getTestDBItems
  • Devuelve una lista con todos los elementos almacenados de forma persistente.

¿Cómo pruebo el comparador?

El código se estructura de la siguiente manera:

neonigma@hyperion:~/things/persystems$ tree
.
??? backends
?   ??? __init__.py
?   ??? pybsddb.py
?   ??? pydurus.py
?   ??? pyredis.py
?   ??? pytables.py
?   ??? pyzodb.py
??? __init__.py
??? test.py

En el directorio backends se encuentran los módulos que implementan los diferentes sistemas de persistencia. En el directorio principal, encontramos el programa test.py. Hay que modificar la variable FILENAME para que apunte a un fichero CSV válido:

FILENAME = '/tmp/fichero1.csv'

Al final del proograma, encontramos las llamadas a la ejecución de pruebas sobre cada backend:

tester = Test(getCSVReader(), "pytables")
tester = Test(getCSVReader(), "pybsddb")
tester = Test(getCSVReader(), "pyzodb")
tester = Test(getCSVReader(), "pydurus")
tester = Test(getCSVReader(), "pyredis")

Basta con comentar las que no queramos incluir en la ejecución de las pruebas. Para ejecutar el programa, escribimos:

neonigma@hyperion:~/things/persystems$ python test.py
pytables writing time: 0.0846199989319
pytables reading time: 0.0147368907928

pybsddb writing time: 0.278237104416
pybsddb reading time: 0.0832049846649

pyzodb writing time: 0.164448976517
pyzodb reading time: 0.0207080841064

pydurus writing time: 0.253404855728
pydurus reading time: 0.0357837677002

pyredis writing time: 1.39871191978
pyredis reading time: 0.624420881271

Closing remaining open files: /tmp/testpytables.db... done

En este caso los tiempos son pequeños porque estoy utilizando un fichero CSV pequeño, de 10K líneas, pero ya puede apreciarse que el ganador de la comparativa es PyTables.

A 1 persona le gusta esta entrada

Comprobación PEP8 de estilo del código Python para VIM

PEP8 es el nombre clave de la Guía de estilo para código Python publicada en julio de 2001 y que aún a día de hoy, diez años después, sigue revisándose.

Para ayudarnos en esta tarea, mi compañero de batallas @pipotux me descubrió una muy buena extensión para Vim mientras trabajábamos en un proyecto Python que nos traemos entre manos.

La instalación es sencilla:

  1. neonigma@neonigma-desktop:~$ cd /tmp
  2. neonigma@neonigma-desktop:/tmp$ git clone https://github.com/cburroughs/pep8.py.git
  3. neonigma@neonigma-desktop:/tmp$ sudo apt-get install python-setuptools
  4. neonigma@neonigma-desktop:/tmp$ cd pep8.py
  5. neonigma@neonigma-desktop:/tmp/pep8.py$ python setup.py build
  6. neonigma@neonigma-desktop:/tmp/pep8.py$ python setup.py install
  7. neonigma@neonigma-desktop:/tmp/pep8.py$ wget http://www.vim.org/scripts/download_script.php?src_id=14366 -O pep8.vim
  8. neonigma@neonigma-desktop:/tmp/pep8.py$ mkdir -p  ~/.vim/ftplugin/python
  9. neonigma@neonigma-desktop:/tmp/pep8.py$ mv pep8.vim ~/.vim/ftplugin/python

Una vez realizados estos pasos, basta con abrir cualquier archivo Python con Vim y pulsar F5. El plugin informará de los errores de estilo cometidos o arrojará un mensaje indicando que el código está escrito conforme a la PEP8.

Fuente: página oficial del plugin pep8 para Vim.

A 1 persona le gusta esta entrada