Archivi Categorie: Python

Sympy – III

sym2

Funzioni trigonometriche

f0

f1

OK, ce ne sono parecchia altre che, come dire, non si usano tutti i giorni.

Equazioni differenziali

f2

Equazioni algebriche

f3

f4

Matrici

f5

ci possono essere anche simboli

f6

Pattern matching

Espressione che non so tradurre :-(

f7

se non ce la fa restituisce None

f8

e si possono escludere certi risultati

f9

Espressione per \LaTeX

f10

f11

Adesso installo pyglet, da http://www.pyglet.org, anzi no dal Sotware Center.

f12

OK, con questo è finito il tutorial. Ora di provare a fare qualcosa di sensato. Prossimamente, forse… ;-) :) :-D

Python e me

Nei giorni scorsi ero alle prese con la preparazione di uno dei nostri articoli di ricerca, in cui ad un certo punto abbiamo cercato di comparare tre strumenti software di analisi. Ognuno degli strumenti è in realtà un prodotto di ricerca, e ognuno è scritto con un linguaggio diverso: il nostro programma, RTSCAN, è scritto in C++; IMITATOR, un tool che hanno sviluppato qui in Francia, è scritto in OCaml; e infine MAST è uno strumento sviluppato all’Universidad de Cantabria in Spagna, ed è scritto in Ada. Ognuno produce risultati in maniera completamente diversa, e c’era quindi la necessità di elaborare questi dati in output in maniera uniforme, per poi produrre dei grafici “decenti”.

Avevamo quindi bisogno di un po’ di script per generare dei dati in input ai tre strumenti, lanciarli, collezionare e uniformare gli output. Abbiamo cominciato con un grande classico: un po’ di bash scripting. Però dopo un po’ ci siamo resi conto che non saremmo andati molto lontano. Un po’ perché io sono sempre stato lento con bash: non mi piace molto la sintassi, e quindi trovo difficile memorizzarla. Un po’ perché sarebbero stati necessari dei tool esterni non banali, e quindi alla fine il risultato non sarebbe stato molto portabile.

Per fortuna che c’è Python. Io non ho mai davvero imparato il Python, perché non ne ho mai avuto il tempo. Non ho tempo per mettermi davanti a un libro o a un corso (anche di quelli accellerati) per imparare l’ABC di un linguaggio. E soprattutto, non ho tempo per imparare a usare le varie librerie (e ce n’è davvero tante). Ma per fortuna, Python ha due caratteristiche peculiari:

1) E’ facile cominciare. Cioè, in realtà all’inizio potete considerarlo tranquillamente come se fosse un linguaggio di scripting. Non c’è bisogno di astruse direttive, di dichiarare variabili, di scrivere funzioni, non c’è bisogno neanche di un main. Si parte a scrivere codice come viene viene, ed è molto probabile che funzioni subito come avevamo pensato.

2) In linea c’è tutto. Qualunque cosa tu voglia fare, basta googlare, e finisci o sul manuale di Python in linea, o su stackoverflow, dove hanno sempre la ricetta pronta per te.

Naturalmente, bisogna conoscere un minimo le basi della programmazione. Ma dal pensiero alla realizzazione passa davvero molto poco.

E passiamo a scrivere brevemente il nostro lavoro. Come prima cosa, avevamo bisogno di specificare il sistema da far analizzare ai tre strumenti. Per semplicità ed immediatezza, abbiamo scelto il formato JSON, che adesso va per la maggiore.  E naturalmente Python ha una libreria per leggere e interpretare un file JSON con sole due funzioni, e il risultato è una lista di dizionari.

Poi, abbiamo scritto 3 funzioni per visitare la lista di dizionari e produrre tre file di input per i tre strumenti. Poi abbiamo scritto 3 funzioni per lanciare i 3 strumenti. Infine, abbiamo fatto post-processing sugli output. Tutto questo in una mezza giornata. Un altro paio di giornate è passato a mettere a posto le cose (perché c’è sempre qualcosa da sistemare, naturalmente) e a cercare di far produrre dei grafici decenti a gnuplot (e ci siamo riusciti solo parzialmente).

Ma la cosa bella di Python è che non si limita ad essere un semplice linguaggio di scripting, ma ha tutte le potenzialità di un vero linguaggio di programmazione. Costrutti evoluti, Object Orientation, ma anche un po di functional programming. C’è la tipizzazione a run-time (il cosidetto duck-typing), il garbage collector. Utilizzando uno stile di programmazione pulito, Python consente di scrivere programmi molto eleganti e “belli”, senza grosso sforzo.

E’ insomma un linguaggio scalabile: si può andare facilmente dal piccolo script di poche linee, al programma mediamente complesso senza grossi problemi. Inoltre ti consente di fare fast prototyping: se hai un’idea, la butti giù e la testi in pochi minuti e con poco sforzo, e la puoi tenere lì in caldo pronto a riprenderla e ad evolverla in qualcosa di più complesso più avanti.

Ha dei difetti? Non sono sicurissimo di quanto possa scalare Python. Se il progetto diventa veramente grande, e con tanti programmatori, non sono sicuro che Python basti. Per esempio, il codice Python può diventare orribile se scritto male e senza giudizio; il fatto che si usi duck-typing richiede una certa dose di coordinazione sulle interfacce quando si lavora in tanti; e quando un progetto è grande, non è detto che tutti i programmatori siano allo stesso livello.

Insomma, mi sa che mi tocca studiarmelo meglio. Adesso che l’ho provato in un caso quasi reale, penso che comincerò ad utilizzarlo sempre più spesso!

Sympy – II

Continuo l’esame delle cose che fa Sympy, la prima puntata qui.
Sì lo so, può sembrare noioso ma …, m’interessa, ecco.

sym

Limiti
Immediati usando limit(funzione, variabile, punto)

s1

Derivazione
si usa diff(funzione, variabile)

s2

verifica

s3
e sì, la derivata è il limite del rapporto incrementale, mi sembra di essere tornato in prima elementare! (o si facevano un po dopo queste robe?)

Si può fare anche cose come queste:

s4

Espansione di serie

s5

s6

Sommatorie

s7

s8

Integrali

s9

anche con funzioni non da tutti i giorni

s10

il calcolo

s11

Numeri complessi

s12
C’è roba per un post ancora, prossimamente… ;-)

Sympy – I

sympy-1
OK, dopo la ricognizione a volo d’uccello –questa– vediamo di seguire il tutorial disponibile in docs/sympy.org.

Intanto c’è una console isympy:

s0
dove si possono fare cose come questa

s1
Attenzione ai simboli predefiniti, non viene reso il valore numerico in automatico

s2

C’è \infty si scrive oo (sì, c’è un errore ma va bene così ;-) )

s3

Le variabili simboliche devono essere dichiarate

s4

ma ne esistono di predefinite nel modulo abc

s5

Al posto di Symbol si può usare symbols

s6

var aggiunge automaticamente i simboli creati

s7

A questo punto si possono fare calcoli simbolici

s8

apart per la scomposizione parziale

s9

s10

together per ricombinare

s11

s12

Non è che l’inizio, prossimamente… forse ;-)

SymPy

slogoTutto è partito, l’altro giorno, da un post di John D. Cook, questo: Narcissus prime in Python.
Non ho rifatto il calcolo di John, troppo lungo, ma SymPy l’ho installato subito. Per Ubuntu si trova nel Software Center, altrimenti basta installarlo dal suo sito.

Ah! dimenticavo le presentazioni:

SymPy is a Python library for symbolic mathematics. It aims to become a full-featured computer algebra system (CAS) while keeping the code as simple as possible in order to be comprehensible and easily extensible. SymPy is written entirely in Python and does not require any external libraries.

OK, devo ancora leggere il manuale, per adesso ho provato qualcosa, usando le slide di Mateusz Paprocki, del team di sviluppo di SymPy

Allora vediamo: limiti, integrali, derivate:

s1E funziona come si deve, esempio:

s2Sì, c’è oo che è vale \infty

s21

e i numeri razionali

s3

Tornando a JDC, una prova con un numero decente, 44 cifre, preso da qui

s4

E sì, se gli chiedo i divisori mi da tutte le potenze di 2, da 20 a 2127.

Insomma SymPy mi è sympatico, da studiare :-D
E raccontare, prossimamente … forse ;-)

PicoLisp

Recentemente qualcuno mi ha segnalato una piccola meraviglia: un piccolissimo ma efficientissimo client-server web scritto in PicoLisp. Siccome sono un pasticcione (e poi avevo l’influenza) ho perso il link, dovrebbe essere questo.

Ecco PicoLisp; intanto Pico è il nome, tra le altre cose, del mio fedele cagnolino, specialissimo.

Logo_PicoLispPicoLisp (qui e qui) lo conoscevo già e ieri me lo sono rivisto un pochino, sigh.
Kazimir Majorinc ne ha parlato più volte, per esempio qui e qui.
A proposito il blog di Kazimir sembra abbandonato, peccato. Ma forse, chissà…

Nl_logo
Però sapete una cosa: io sono affezionato a newLISP (qui e qui), per ragioni storiche ma non solo: è il mio dialetto preferito, il più semplice, facile, efficace perche il mio.

Ecco, quello dei dialetti è la vera ragione per cui il LISP non diventerà mai popolare. Oltre alla sintassi fuori dal comune –che però è il suo punto di forza :-D

pico
No, non ne parlo: ogni volta che lo nomino le visite del blog crollano. E lo spread s’impenna.
Sono pythonista, me lo chiede la blogosfera ;-)

Nadia & Python

OK, devo cominciare con una confessione: non so chi mi ha segnalato questo blog. Cosa che dev’essere capitata nella prima metà di dicembre, stando alla data del file con l’URL dentro ma nessuna nota, niente appunti, messo tra le cose interessanti & urgenti ma che possono aspettare un attimino. Pensare che è proprio bello. E peccato che il blog non è più attivo, non aggiornato da settembre 2009, una vita.

Ma siccome dentro ci trovate tante idee ve lo voglio far conoscere. Nadia Alramli lavora a Dublino per DemonWare, sembra un posto interessante. E poi lì c’è la Guiness –ma questo non c’entra.

dw1
Allora, il blog, lo trovate qui: nadiana  e dentro ci sono tante cose. Per dire un tutorial di PIL (Python Image Library). In effetti il blog non è durato molto, chissà, altri interessi, recentemente si è vista su Stack Overflow (probabile che l’ho vista lì, ora che ci penso, forse nèh!).

Per invogliarvi a visitare il blog niente di meglio che riprodurre un suo script, piccolo ma sexy: una progress bar animata:

#!/usr/bin/python
# -*- coding: utf-8 -*-

from progressbar import ProgressBar
import time
p = ProgressBar('green', width=20, block='▣', empty='□')
for i in range(101):
    p.render(i, 'step %s\nProcessing...\nDescription: write something.' % i)
    time.sleep(0.1)

tp1
Richiede il modulo terminal.py, lo trovate da Nadia, qui.
Dove naturalmente ci sono altre cose intrigose:

import terminal

from terminal import render
print render('%(BG_YELLOW)s%(RED)s%(BOLD)sHey this is a test%(NORMAL)s')
print render('%(BG_GREEN)s%(RED)s%(UNDERLINE)sAnother test%(NORMAL)s')

t
OK, per oggi basta: è quasi festa ;-) :-) :-D

Parto con un nuovo linguaggio

Cioè no, c’era stata una falsa partenza ma adesso mi metto su davvero. Promesso.
Ma prima una premessa: quando ero nuovo nel campo c’era chi proponeva un linguaggio buono per tutti e io ero anche andato a una presentazione a Milano, credo da parte di IBM ma non ne sono sicuro (e c’è il rischio che ZAP poi mi cazzia come per APL).

Il linguaggio era PL/1, sì credo proprio che fosse IBM. Questo secondo i suoi proponenti sarebbe andato bene (anzi meglio) per tutto. Le cose poi sono andate molto diversamente. Sono nati millemila linguaggi, ognuno specifico per un campo particolare (+/-, nèh!).

E si continua, anche se mi sembra che il ritmo sia rallentato (e poi sono fuori, non aggiornato). Ultimamente poi va di moda riciclare i vecchi, come quando (sempre da piccolo) si usavano i cappotti rivoltati (a me rifilavano quelli). Dal Basic originale sono nati discendenti targati M$ irriconoscibili, è cambiato anche il Fortran, dal C è nato il C++ che periodicamente viene rimescolato.

Certo ce ne sono anche di (relativamente) nuovi, come Python, Ruby, Haskell e Erlang. Non è che li inseguo tutti, anzi…
Ho amici che usano abitualmente Lua, Ruby, Delphi e simili ma io sono più conservativo.
Dalla mia lista di blog RSSati ecco quelli che seguo (o vorrei seguire).

Go
command center
go with confidence
The Go Programming Language
doxsey.net

Haskell
Bartosz Milewski’s Programming Cafe
FP Complete
Inside ###
Hello | David Siegel
yannesposito.com

Python
I say things
J5’s Blog
Jesse Noller
Kunigami’s Blog
Markon’s blog
Open resource
Palmux | Dall’informatica al rock and roll e ritorno…
Python Conquers The Universe
Python Examples
Robitex’s Blog
SaltyCrane Blog
Satyajit Ranjeev
Sebastian Pölsterl’s blog
SlashCode
tartley.com
The Endeavour
The Mouse Vs. The Python
Stanzinofree
Pythonic Perambulations

Forse ne ho dimenticato qualcuno, forse qualcuno è abusivo. Qualcuno è monomaniaco, altri polymaniaci, insomma è un tentativo.
Poi ci sono altri linguaggi ma questi sono quelli più sexy cool, secondo me, ora. E cambio spesso idea.
Esaminando la lista sembrerebbe che voglio parlare di Python, vero?
Sbagliato! Anche se è appena partito un corso –facile-facile– al quale partecipo, trovate tutto da Bit3Lux, no non è lui, basta Python.

Haskell mi risulta difficile da metabolizzare, ha una sintassi mooolto diversa dal solito, forse avendo un caso cui applicarlo, costretto…
E poi è considerato un rivale del mio linguaggio preferito, non voglio che si pensi che lo sto tradendo (anche se appena lo nomino cala il gelo (per questo non vi dico qual è)).

Go, ecco! questo m’intriga. I padri di Unix erano tutti per il C. Nessuno di loro, per quel che ne so, ha mai endorsato il C++. Neanche Rob. E siccome il C è nato in un’altra era è giunto il momento di fare qualcosa di nuovo, che risponda a nuove necessità intervenute e corregga alcune cose che potevano essere fatte meglio. Per esempio liberarsi dei punti-virgola non necessari. Ecco, provo a raccontare qualcosa di Go. Oltre che sui documenti del sito ufficiale del linguaggio ho una guida semplice e ben fatta: An Introduction to Programming in Go di Caleb Doxsey, si può trovare qui o qui.

Ah, sì, quidi libri ne trovate tantissimi, fateci un salto, se vi va.

Speruma, direbbero a Türin ;-)

Uh! naltra cosa: un minicorso di Python

Ecco, io sono in ritardo su tutto (ma è il mondo che corre troppo veloce) ma sono entrato in un’altra avventura: un minicorso di Python, semplice-semplice, davvero.

Trovate qui la prima puntata: Mission python: L’installazione.

OK! devo dirvi tutta la verità, tanto prima o poi lo scoprireste da soli: il corso è principalmente di Luigi e Ennio, io fornisco un supporto tecnico. E anche il blog (o i blog, non me l’hanno ancora detto, anzi me l’hanno detto più volte ma sapete che sono un po’ lento di comprendonio) su cui viene pubblicato non è il mio.


Come Einstein insegna “Chi ben comincia è a metà dell’opera” per cui chi vuole può arruolarsi e chi è indeciso legga per intanto la presentazione, poi chissà, “da cosa nasce cosa” (sempre Einstein).


Ecco, niente di speciale ma ci tenevo a farvelo sapere. Anche perché Luigi e Ennio sono persone –come si dice, ah sì- cool. Davvero.


Ci vediamo di là. Se volete, nèh, nessun obbligo.

Python, dice Guido

Sì lo so che ho millemila cose da finire ma ho trovato questo su G+, viene da Guido, quel Guido (krrkwido):

Some patterns for fast Python. Know any others?

  • Avoid overengineering datastructures. Tuples are better than objects (try namedtuple too though). Prefer simple fields over getter/setter functions.
  • Built-in datatypes are your friends. Use more numbers, strings, tuples, lists, sets, dicts. Also check out the collections library, esp. deque.
  • Be suspicious of function/method calls; creating a stack frame is expensive.
  • Don’t write Java (or C++, or Javascript, …) in Python.
  • Are you sure it’s too slow? Profile before optimizing!
  • The universal speed-up is rewriting small bits of code in C. Do this only when all else fails.

Naturalmente commenti, +1 e condivisioni sono più che numerabili, ecco i primi:
Sindri Avaruus: I like decorators. They can do some nifty tricks :)

Krzysztof Klinikowski: PyPy e Numba

Michael Foord: Understand the performance characteristics of basic operations on the builtin types. For example checking for membership in a list is O(N) but for a set or dictionary it is O(1). Adding lists and tuples creates new objects, inserting to the left of a list is O(N) whilst append is O(1) (use a deque instead). And so on.

Robert Collins: Don’t use threads in Python (and don’t use multiprocessing either, its about 3 times slower than something like 0mq or even just shelling out). +1 on +Michael Foord for knowing the big O of the things you are working with.
Also, understand your memory footprint: avoiding circular references can prevent large (transient) memory bloat occuring, and memory bloat hurts performance a lot (not just because gc.collect gets slower, but it can trigger paging)
I’ve written some heinous code using basic datatypes. I’d take that one off the list:)

Mmmh! mi sa che conviene leggere tutto il post, lo trovate qui
Guido van Rossum – Sept 10, 2012. 9:41 PM  -  Public.

Di mio vorrei aggiungere che gli oggetti (classi e metodi) si dimostrano utili solo quando il programma raggiunge una certa dimensione e cessa di essere un semplice script. E poi sono della vecchia scuola: terminale e linea di comando.

Quando il BDFL interviene con le sue parole di saggezza tanti nerd / geek si trovano pronti a partecipare. La stessa cosa non capita negli altri linguaggi che uso o che vorrei usare. Per fortuna: dove troverei il tempo, devo già recuperare quello perso con questo post ;-)

Iscriviti

Ricevi al tuo indirizzo email tutti i nuovi post del sito.

Unisciti agli altri 37 follower