Spyppolare o non spyppolare

28
SPyppolare o non sPyppolare? a script by Federico Di Gregorio Pycon Italia Qu4ttro – Firenze 8,9 maggio 2010

description

Federico di Gregorio

Transcript of Spyppolare o non spyppolare

Page 1: Spyppolare o non spyppolare

SPyppolare o non sPyppolare?

a script byFederico Di Gregorio

Pycon Italia Qu4ttro – Firenze 8,9 maggio 2010

Page 2: Spyppolare o non spyppolare

SPyppolare o non sPyppolare?

a script by

Federico Di Gregorio

Pycon Italia Qu4ttro - Firenze 8,9 maggio 2010

A A

Page 3: Spyppolare o non spyppolare

Nella bella Firenze,

dove noi collochiam la nostra scena,

molti linguaggi di pari nobiltà;

ferocemente gli uni agli altri oppone

da vecchia ruggine nuova contesa,

onde codice sublime va macchiando

chiarissimi fosfori.

H

i

A

Page 4: Spyppolare o non spyppolare

Molti Linguaggi● Perché la azienda (per la quale, ovviamente,

lavoriamo) ce lo impone.● Perché non tutti i problemi sono chiodi.● Perché non tutti i chiodi sono problemi.● Perché “Erlang fa ma se vuoi fare questo e quello

allora non puoi farne a meno...”

Page 5: Spyppolare o non spyppolare

Relax Programming

Page 6: Spyppolare o non spyppolare

Dramatis Personae - Basso Livello

C

Page 7: Spyppolare o non spyppolare

Dramatis Personae Java XP–

Page 8: Spyppolare o non spyppolare

Dramatis Personae ???–

Page 9: Spyppolare o non spyppolare

Dramatis Personae Sigh!–

Page 10: Spyppolare o non spyppolare

Programmare “Enterprise”

Page 11: Spyppolare o non spyppolare

Programmare “Enter-Pool”

Page 12: Spyppolare o non spyppolare

PyPremessaQuelle parti del linguaggio che già sono Pythoniche non ci interessano più di tanto.

[x * x for x in get_all_xs()]

from x in get_all_xs() select x * x;

L

Page 13: Spyppolare o non spyppolare

PyVantaggiAndiamo ad elencare i vantaggi del Python...● Compatto e leggibile● Mix imperativo e funzionale● Dooolce! (nel senso di zucchero sintattico)● Se non puoi risolvere un problema: aggiralo!

● “Sei il GIL non si scrosta, scrostiamo i thread.”

Page 14: Spyppolare o non spyppolare

PyEsempiTre esempi che a me piacciono molto:● nevow stan, per la generazione di HTML● Stackless Python● multiprocessing, per parallelizzare● execnet (solo perché l ho visto ieri...)'

Q

Page 15: Spyppolare o non spyppolare

Dominare il DOMhead = document.createElement(“head”)

title = document.createElement(“title”)

title.innerHTML = “Questo NON è stile!”

head.appendChild(title)

document.rootElement.appendChild(head)

body = document.createElement(“body”)

document.rootElement.appendChild(body)

...

Page 16: Spyppolare o non spyppolare

PyStile from nevow import flat, tags as T

html = T.html[

T.head[“Questo è Stile!”],

T.body[T.p(class=”red”)[

“E questo è un paragrafo rosso e stiloso...”,

lambda ctx, data: “...e funzionale!” ]]]

print flat.flatten(html)

“<html><head>Questo è stile!</head><body>...”

Page 17: Spyppolare o non spyppolare

PyStile#using Tesseract.Html;

var T = new HtmlTemplate(); var html =

T.head()[“Questo è Stile#!”],

T.body()[T.p(“class”, ”red”)[

“E questo è un paragrafo rosso e stiloso...”,

(ctx, data) => “...e funzionale!” ]]]

Console.WriteLine(html.ToString());

“<html><head>Questo è stile!</head><body>...”

Page 18: Spyppolare o non spyppolare

Stackless● Modifiche all interprete per supportare “tasklets”.'

● Ovviamente non possiamo modificare XXX.● Il pattern d uso più comune consiste nell avere un ' '

alto numero di tasklets che collaborano.● Twisted fa più o meno la stessa cosa coi generator.

Mumble mumble...

Page 19: Spyppolare o non spyppolare

My Name is I, IEnumerablepublic class Agent007 {

Public Agent007(Scheduler s, Queue kills) {

this.kills = kills; this.scheduler = s; s.AddTask(Investigate());

}

IEnumerable Investigate() {

if (LocateSpectreAgent()) {

this.kills.Push(1); yield return Kill();

}

yield return DrinkMartini();

}

Page 20: Spyppolare o non spyppolare

My Name is I, IEnumerable (2) IEnumerable Kill() {

this.schedule.AddTask(new KillAnimation(this).Start());

}

IEnumerable DrinkMartini() {

yield return new Timespan(2);

}

IEnumerable MeetBeautifulWoman() {

yield return new Signal(“randezvous”);

}

} B

Page 21: Spyppolare o non spyppolare

multiprocessing● Utilizzo delle caratteristiche esistenti del sistema● API simile a quelle già esistenti (threading)● Rimozione dello stato condiviso● Primitive di sincronizzazione esplicite

MA

Di nascosto la libreria fa tutto ci che voi non fate!ò

Page 22: Spyppolare o non spyppolare

“square-reduce”def square_range(q, a, b):

for x in xrange(a, b):

q.put(x*x)

q = Queue()

p1 = Process(target=square_range, args=(q,0,1000))

p2 = Process(target=square_range, args=(q,1000,2000))

# Recuperiamo i dati qui...

D

Page 23: Spyppolare o non spyppolare

“square-reduce-faster”def square_range(q, a, b):

result = [x * x for x in xrange(a, b)]

q.put(result)

q = Queue()

p1 = Process(target=square_range, args=(q,0,1000))

p2 = Process(target=square_range, args=(q,1000,2000))

# Recuperiamo i dati qui...

Page 24: Spyppolare o non spyppolare

“square-reduce-done-right”● Incredibile quanto in passato le librerie per il

multithreading si siano concentrate sulle primitive.● Semantica che non richieda lock espliciti.

Parallel.Range(1,1000000)

.Select(x => x * x)

.Sum();

Page 25: Spyppolare o non spyppolare

Duck Typing...

...is sexy!

PyQuack! PyQuack!

Page 26: Spyppolare o non spyppolare

Quack! Quack!

“When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a

duck.”

Page 27: Spyppolare o non spyppolare

Hiss! Hiss!

Se vedo un serpente che striscia come un Pytone, che sibila come un Pyton e che si programma come un

Pytone, non é detto che sia un Pytone.

Ma il fatto che ci assomigli mi rende molto, molto, molto felice!

Page 28: Spyppolare o non spyppolare

The End

Federico Di Gregorio<[email protected]>