Cython rocks

Ho cominciato a lavorare sul serio all’università, in laboratorio si macinano proteine, tante, ed il povero Python non regge il passo.

Durante la sosta forzata mi sono baloccato con OCaml, e devo dire che è un linguaggio interessante, anche se per ora non sono ancora riuscito a realizzare un qualcosa di funzionante :/ !

Uscito da gesso e riabilitazione, ho cominciato a studiare le “nuove” reti neurali (deep neural networks), e ne ho implementata una in poche paginate in Python.

Però la velocità è quella che è… allora è partito il pellegrinaggio:

  1. Ho riscritto il tutto in OCaml, ma c’è un bug che non fa convergere nulla… e non lo trovo!
  2. Ho provato pypy, per vedere se il mio codice era abbastanza RPython… ma non lo era
  3. Ho provato ShedSkin, ma anche per lui il mio codice non era abbastanza statico.

Allora mi sono arreso, l’inferenza ancora non è gratuita, e mi sono “abbassato” a buttare giù tipi e gestire la memoria, in Cython!

Adesso, avendo reimplementato solo la classe Layer, l’apprendimento ha una velocità decente, il codice resta leggibile, non ho “esportato” il bug della versione in OCaml ed ho spazio per ulteriori ottimizzazioni senza perdere le comodità di Python!

Yuppie!

Setup a local macports repository

(Update: Official Guide Local Repositories)

Setting up a local macports repository is quite easy:

– create a repo folder, like: sudo mkdir /opt/local/var/localports

– update the config sudo vim /opt/local/etc/macports/sources.conf adding file:///opt/local/var/localports

– create your port mirroring the model in /opt/local/var/macports/sources/

– update the index with: sudo portindex /opt/local/var/localports

– install the new port!

Ho trovato un buggettino a cElementTree!

Giorni fa ho trovato il mio primo bug in un codice sorgente “serio”!

Playing with PyInstaller I have found that the final part of _elementtree.c:
Index: Modules/_elementtree.c
===================================================================
--- Modules/_elementtree.c (revisione 59540)
+++ Modules/_elementtree.c (copia locale)
@@ -2780,7 +2780,10 @@

);

- PyRun_String(bootstrap, Py_file_input, g, NULL);
+ if (PyRun_String(bootstrap, Py_file_input, g, NULL) == NULL) {
+ m = PyErr_Occurred();
+ return;
+ }

elementpath_obj = PyDict_GetItemString(g, "ElementPath");

execute a bit of python code without checking the return value.
That can lead to weird things playing with import hooks,
for example an assert like this can fail:

Continua a leggere

Quality in Ranking

A good ranking is what all searchers wants back from a query.

A widely used measure for prediction are Precision and Recall.

In a few words:

Precision measures the hit rate over the times you shoot. More you shoot, more easily you can hit, but you have a low Precision
Recall measures the hit rate over the hittable. You can reach the maximal Recall hitting all the targets, no problem how many tries you did.

It is quite obvious that shooting a lot you can have a good Recall and a bad Precision, on the opposite side, shooting only a few good slugs you will have a good Precision, but a small Recall.

Continua a leggere