Ohjelmoinnin peruskurssien laaja oppimäärä

Samankaltaiset tiedostot
Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Perintä (inheritance)

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 5: Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssien laaja oppimäärä

815338A Ohjelmointikielten periaatteet

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

Tutoriaaliläsnäoloista

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

Muistutus aikatauluista

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssien laaja oppimäärä

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssien laaja oppimäärä, kevät

Ohjelmoinnin perusteet Y Python

Tietorakenteet ja algoritmit - syksy

Tentti: T Ohjelmoinnin peruskurssi, osa 1. Yleistä. Tehtävä 1

Ohjelmoinnin perusteet Y Python

Lyhyt kertaus osoittimista

Ohjelmointi 1 C#, kevät 2013,

Ohjelmoinnin perusteet Y Python

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Algoritmit 1. Luento 3 Ti Timo Männikkö

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssien laaja oppimäärä

Kerta 2. Kerta 2 Kerta 3 Kerta 4 Kerta Toteuta Pythonilla seuraava ohjelma:

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Luento 4 Aliohjelmien toteutus

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssi Y1

Hakemistojen sisällöt säilötään linkitetyille listalle.

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Tietorakenteet, laskuharjoitus 10, ratkaisuja. 1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

Kerta 2. Kerta 2 Kerta 3 Kerta 4 Kerta 5 Kerta 6 Kerta Toteuta Pythonilla seuraava ohjelma:

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Pythonilla. Teemu Sirkiä, 2015

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

linux linux: käyttäjän oikeudet + lisää ja - poistaa oikeuksia

Kokeellista matematiikkaa SAGE:lla

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Ohjelmoinnin peruskurssi Y1

Luento 5. Timo Savola. 28. huhtikuuta 2006

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Kysymyksiä koko kurssista?

Jakso 4 Aliohjelmien toteutus

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Transkriptio:

Dekoraattorit Listaoperaatiot Prolointi Ohjelmoinnin peruskurssien laaja oppimäärä Luento 11: Suorituskyvyn mittaaminen, Pythonin ominaisuuksia Riku Saikkonen (osa kalvoista on suoraan ei-laajan kurssin luennoista) 8. 4. 2013

Dekoraattorit Listaoperaatiot Prolointi Sisältö 1 Pythonin propertyt ja dekoraattorit 2 Pythonin listaoperaatiot ja list comprehension -syntaksi 3 Suorituskyky ja prolointi

(ei-laajan kurssin kalvo: luento 13 sivu 9) Dekoraattorit Listaoperaatiot Prolointi property Eli miten saada olion muuttujien käsittely saadaan näyttämään siltä, että niitä käytetään suoraan ilman metodeja. Käsiteltävä muuttuja class C(object): def init (self): self._x = None def getx(self): return self._x def setx(self, value): self._x = value def delx(self): Property:n docstring del self._x x = property(getx, setx, delx, "I'm the 'x' property.") new_object = C() new_object.x = 3 print new_object.x Varsinainen muuttuja kannattaa suojata _:lla Metodit arvon hakuun, asettamiseen ja poistoon. Järjestys on aina: haku, asetus, poisto. Muuttujan sijainti lauseessa määrää, mitä funktiota tulkki käyttää 14:45

(ei-laajan kurssin kalvo: luento 5 sivu 25) Dekoraattorit Listaoperaatiot Prolointi Propertyn avulla koodia voi yksinkertaistaa Metodeja kutsutaan kuin muuttujia Käsitellään muuttujaa x Kerrotaan property-funktiolle sen metodin nimi, jolla x:n arvo haetaan(get) ja sen, jolla asetetaan x:n arvo(set) Tulkki päättelee x sijainnin perusteella pitääkö käyttää asetus- vai hakumetodia =:n vasemmalla puolella tarvitaan tietenkin sijoitus Tulostuksessa haku Jne. class Example(object): def init (self): self._x = None def get_x(self): return self._x def set_x(self, value): self._x = value x = property(get_x, set_x) some = Example() some.x = 5 print some.x 14:58

(ei-laajan kurssin kalvo: luento 13 sivu 15) Dekoraattorit Listaoperaatiot Prolointi decorator Decorator Pythonissa tarkoittaa lyhyempää tapaa esittää tilanne, jossa muutetaan funktion toimintaa (eli periaatteessa sitä mitä decorator-malli tarkoittaa). def decorator_function(called): called.message = 'Change in the functionality' return called @decorator_function def adding(a,b): return a + b print adding(1, 2), print adding_copy.message def adding(a,b): return a + b target = decorator_function(adding) print target(1, 2), print target.message @-merkin jälkeen tulee funktion nimi. Tämä funktio saa parametrinaan @-merkin alapuolella olevalta riviltä alkavan funktion olion, jonka toimintaa se sitten muuttaa 14:45

(ei-laajan kurssin kalvo: luento 13 sivu 16) Dekoraattorit Listaoperaatiot Prolointi decorator Pythonissa on kaksi valmista funktiota, joita voi käyttää decorator-rakenteen yhteydessä. * staticmethod muuttaa metodin toimintaa niin, että sitä voi kutsun jo ennen kuin sen luokasta on luotu oliota. * classmethod taas tekee metodista luokkametodin, eli metodin, joka on yhteinen kaikille luokasta luoduille olioille. @staticmethod ## we can now call this method without an instance def column_char_to_integer(column): ''' Converts the letters a,b,c,d,e,f,g,h to positions 0-7. @param row the character representation of a column. @return the integer representation. ''' return ord(column) - ord('a') 14:45

(ei-laajan kurssin kalvo: luento 3 sivu 19) Dekoraattorit Listaoperaatiot Prolointi Abstrakti luokka (esimerkki) LibraryItem abstraktina luokkana Kaikissa siitä periytyvissä luokissa oltava metodit init ja is_available() Lehdet taas eivät kaikki ole lainattavissa, joten DailyPaper abstraktiksi import abc class LibraryItem(object): metaclass = abc.abcmeta @abc.abstractmethod def init (self, author_list,...):... class DailyPaper(LibraryItem): metaclass = abc.abcmeta @abc.abstractmethod def init (self, name, year,...): LibraryItem. init (self,...)... def get_number(self): return self.number def is_available(self): pass class Book(LibraryItem): def get_authors(self): return self.author_list... @abc.abstractmethod def is_available(self): '''Method docstring. ''' def init (self, author_list,...): LibraryItem. init (self,...)... def is_available(self): if self.due_date: return False else: return True 10:31

Dekoraattorit Listaoperaatiot Prolointi Property-dekoraattorit Toinen versio aiemmasta esimerkistä class Example(object): def init (self): self._x = None @property def x(self): return self._x @x.setter def x(self, value): self._x = value siis property toimii dekoraattorina, joka tekee getter-metodin x.setter on dekoraattori, joka vaihtaa x:n setter-metodin dekoraattoreita voi tehdä melko helposti itsekin muuhunkin käyttöön kuin getter- ja setter-metodeihin esimerkkejä: http://wiki.python.org/moin/pythondecoratorlibrary muissa kielissä samantapaisia rakenteita ovat Emacs Lispin defadvice ja Common Lispin oliojärjestelmän around-metodit

Dekoraattorit Listaoperaatiot Prolointi Dekoraattoriesimerkkejä käytännöstä itse määriteltyjä dekoraattoreita Calibre-ohjelmasta (e-kirjojen lukulaitteiden hallintasofta): src/calibre/devices/prs500/driver.py kohta def safe(...) ja @safe-kohdat (dekoraattori tekee monelle metodille yhteistä alustusta ja virhekäsittelyä) setup/installer/osx/app/main.py kohta def flush(...) ja @flush-kohdat (dekoraattori tyhjentää tulostuspuskurit ennen ja jälkeen koristelemansa funktion suorituksen)

Dekoraattorit Listaoperaatiot Prolointi Sisältö 1 Pythonin propertyt ja dekoraattorit 2 Pythonin listaoperaatiot ja list comprehension -syntaksi 3 Suorituskyky ja prolointi

(ei-laajan kurssin kalvo: luento 13 sivu 10) Dekoraattorit Listaoperaatiot Prolointi map def increment(value): return value + 1 def decrement(value): return value - 1 test_list = [1,2,3,4,5] print map(increment, test_list) print map(decrement, test_list) Soveltaa annettua funktiota jokaiseen läpikäytävän olion alkioon ja palauttaa tuloksena listan [2, 3, 4, 5, 6] Parametrina voi antaa useammankin läpikäytävän, jolloin funktion pitää hyväksyä yhtä monta parametria ja jokaisesta läpikäytävästä otetaan vastaava alkio. zip liittää yhteen parametrina saamiensa sarja- tai iteroitavatyyppisten läpikäytävien alkiot monikoiksi listaan l1 = [1, 2, 3] l2 = [4, 5, 6] print zip(l1, l2) [(1, 4), (2, 5), (3, 6)] def fahrenheit(t): return ((float(9) / 5) * T + 32) def celsius(t): return (float(5) / 9) * (T - 32) temp = (36.5, 37, 37.5,39) F = map(fahrenheit, temp) C = map(celsius, F) for f, c in zip(f, C): print f, c 14:45

(ei-laajan kurssin kalvo: luento 13 sivu 11) Dekoraattorit Listaoperaatiot Prolointi filter Nimensä mukaisesti suodatin. Annettua funktiota sovelletaan jokaiseen annetun läpikäytävän alkioon alkio päätyy tuloslistaan, jos funktio palauttaa True. limit = 20 def is_prime(number): if number in [0, 1]: return False if number == 2: return True for divider in range(2, number): if number % divider == 0: return False return True primes = filter(is_prime, range(limit)) print primes [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,..., 19] [2, 3, 5, 7, 11, 13, 17, 19] False False True True 14:45

(ei-laajan kurssin kalvo: luento 13 sivu 12) Dekoraattorit Listaoperaatiot Prolointi reduce Supistaa läpikäytävän yhdeksi arvoksi soveltamalla annettua funktiota jokaiseen alkion. Funktion täytyy ottaa 2 parametria. Hakee suurimman: f = lambda a,b: a if (a > b) else b print reduce(f, [47,11,42,102,13]) 102 Ehdollinen lauseke 47-11 47-42 47-102 102-13 print reduce(lambda a,d: 10*a+d, [1,2,3,4,5,6,7,8]) 12345678 10*1 + 2 10*12 + 3 10*123 + 4 10*1234 + 5 14:45 10*1234567 + 8

Dekoraattorit Listaoperaatiot Prolointi Muistutus: accumulate:n variaatiot (syksyn luennolta 3) accumulate:sta eli fold-right:sta on peilikuva fold-left: (fold-right + 0 (list 1 2 3 4)) (+ 1 (+ 2 (+ 3 (+ 4 0)))) 10 (fold-left + 0 (list 1 2 3 4)) (+ (+ (+ (+ 0 1) 2) 3) 4) 10 ks. SICP-kirjan tehtävä 2.38 molemmista on vielä versiot, joissa ei ole init -alkiota, vaan sellaisena käytetään listan ensimmäistä tai viimeistä alkiota (reduce-right + (list 1 2 3 4)) (+ 1 (+ 2 (+ 3 4))) 10 (reduce-left + (list 1 2 3 4)) (+ (+ (+ 1 2) 3) 4) 10 Pythonin reduce on reduce-left

(ei-laajan kurssin kalvo: luento 13 sivu 4) Dekoraattorit Listaoperaatiot Prolointi List comprehension Luo listan annettua sääntöä noudattaen result_list = [x**2 for x in range(10)] print result_list Tuottaa listan, jossa on lukujen neliöitä. Luvut saadaan forsilmukassa käymällä läpi range:n tuottama lista [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] result_list = [(x, y) for x in [1,2,3] for y in [3,1,4] if x!= y] print result_list [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)] Sama kuin: result_list = [] for x in [1,2,3]: for y in [3,1,4]: if x!= y: result_list.append((x, y)) 14:45

Dekoraattorit Listaoperaatiot Prolointi List comprehension -esimerkki Esimerkki: parittomien lukujen neliöiden summa (accumulate + 0 (map (lambda (x) (* x x)) (filter odd? (enumerate-interval 1 100)))) 166650 ;; Sama Pythonilla: reduce(lambda x,y: x+y, map(lambda x: x*x, filter(lambda x: x%2==1, range(1, 100)))) 166650 sum([ x*x for x in range(1, 100) if x%2==1 ]) 166650 list comprehension on lyhennysmerkintä useimmille map- ja filter-ketjuille Pythonin lisäksi esim. Haskell- ja Scala-kielissä, ei Schemessä lyhennysmerkintä ei auta reduce:en; yllä käytetty sum on vain Pythonin valmis funktio joka tekee saman kuin juuri tämä reduce

Dekoraattorit Listaoperaatiot Prolointi Sisältö 1 Pythonin propertyt ja dekoraattorit 2 Pythonin listaoperaatiot ja list comprehension -syntaksi 3 Suorituskyky ja prolointi

Dekoraattorit Listaoperaatiot Prolointi Suorituskyky Millainen on tehokas tai nopea ohjelma? Ei yksikäsitteistä vastausta. Nopeus Muistinkäyttö Vasteaika (nopea reagointi käyttäjän toimiin) Kuinka näitä voidaan mitata? Profilointi Koodin ja algoritmin analyysi Ο, Θ, Ω Kuinka niihin voi vaikuttaa? Hyvät algoritmit ja tietorakenteet Koodin optimointi 11:08 (ei-laajan kurssin kalvo: luento 11 sivu 3)

Dekoraattorit Listaoperaatiot Prolointi Lisää suorituskyvyn mittauksesta ohjelman käyttämää aikaa voi mitata monella tavalla: suoritusaika tai nopeus: tietty toiminto suoritetaan ajassa x vasteaika (response time, latency): syötteeseen vastataan (viimeistään) ajan d kuluttua läpäisy (throughput): järjestelmä pystyy jatkuvasti suorittamaan esim. m tapahtumaa sekunnissa (yhtäaikaisesti tai peräkkäin) joskus yhden näistä optimointi hidastaa toista reaaliajan lisäksi voidaan mitata resurssien kulutusta: toimintoon kuluu esim. x CPU-sekuntia laskenta-aikaa (tai: m tapahtumaa sekunnissa vie y% CPU:sta) ohjelma vie maksimissaan/keskimäärin n tavua muistia tai muita resursseja (levytilaa, energiaa, avoimia tiedostoja, tietokantakyselyitä, toisen järjestelmän käyttöä, jne.) mittaus kannattaa toistaa monta kertaa ja katsoa, muuttuuko se tulokseen vaikuttavat mm. muut käynnissä olevat ohjelmat, välimuisti ja käyttöjärjestelmän levypuskuri

Dekoraattorit Listaoperaatiot Prolointi Koodin prolointi proloija (proler) mittaa missä kohdissa ohjelma viettää aikaansa mittaa CPU-aikaa joko funktion tai koodirivin tarkkuudella mutta aina kaikki aika ei kulu ohjelmassa itsessään: esim. näytön päivitys voi hoitua toisten ohjelmien avulla toteutus yleensä: pysäytetään ohjelma säännöllisesti hetkeksi ja katsotaan missä se sillä hetkellä on myös käyttöjärjestelmä mittaa aina ohjelman suoritusaikaa työkaluja: sekä reaaliaikaa eli seinäkelloaikaa että laskenta- eli CPU-aikaa laskenta-aika on usein jaettu käyttäjän (user: ohjelman sisällä) ja järjestelmän (system: käyttöjärjestelmän sisällä) ajaksi loppuaika on yleensä muiden ohjelmien tai laitteiden odottelua näihin pääsee myös ohjelmasta (C getrusage, gettimeofday, Python resource- ja time-moduulit) Python: http://docs.python.org/library/profile.html C/C++: mm. gprof, perf Java: jprof

(ei-laajan kurssin kalvo: luento 11 sivu 7) Dekoraattorit Listaoperaatiot Prolointi Koodin profilointi import cprofile...... def main(): app = QtGui.QApplication(sys.argv) ex = MyWindow() ex.start() exit_value = app.exec_() sys.exit(exit_value) if name == ' main ': # main() cprofile.run('main()', 'results') 11:08

(ei-laajan kurssin kalvo: luento 11 sivu 5) Dekoraattorit Listaoperaatiot Prolointi Optimoi vasta lopuksi Optimointi monimutkaistaa koodia (ehkä) Luo uusia virheitä Vaikeuttaa ylläpidettävyyttä Vaikeuttaa jatkokehitystä / perintää Aina ei kannata optimoida Jos voitot ovat pieniä, ylläpidettävyys on tärkeämpää Mutta ensin ohjelma toimivaksi Eikä hitaus aina johdu omasta ohjelmasta Taustalla oleva tietokanta voi olla hitauden syynä Ennaltaehkäise: suunnittele hyvin 11:08