Pomoc s Pythonerm

David Belohrad david na belohrad.ch
Pondělí Červen 13 15:01:04 CEST 2016


Vas skript by mohl vypadat napr takto:

--------------------------------------------------------------------------------
import os
import shutil

# directory to look for:
dirl = "fook"
# get list of all files in the directory fook
dirlist = os.listdir(dirl)
# create list of tuples of type (old-filename, newfilename)
# these are raw filenames without path (hence tuple e.g ("test3", "fook-test3")
oldtonew = zip(dirlist, map(lambda fle: "%s-%s" % (dirl, fle), dirlist))
# append to all paths the correct directory
correct = map(lambda (src,dst): (os.path.join(dirl, src), os.path.join(dirl, dst)), oldtonew)
# now move all files
map(lambda (src, dst): shutil.move(src, dst), correct)
--------------------------------------------------------------------------------

pripadne pokud z nej vysekame vsechny poznamky, ktere jsem tam napsal:
--------------------------------------------------------------------------------
import os
import shutil

dirl = "fook"
dirlist = os.listdir(dirl)
oldtonew = zip(dirlist, map(lambda fle: "%s-%s" % (dirl, fle), dirlist))
correct = map(lambda (src,dst): (os.path.join(dirl, src), os.path.join(dirl, dst)), oldtonew)
map(lambda (src, dst): shutil.move(src, dst), correct)
--------------------------------------------------------------------------------

tedy 4 radky srozumitelneho kodu. Samozrejme to neni o poctu radku kodu, ale o tom, jak dlouho
to trva vykonat. Troufam si tvdit, ze skript kolegy Mraze je podstatne pomalejsi, nez to co jsem
tady vyrobil (a co se da jeste zjednodusit, kdybych zapremyslel jeste trochu). Pokud ty dva skripty
pustite na 100000 souborech, uvidite ten rozdil :) Samozrejme v tomto pripade je to trochu overkill,
ale pokud delate napr. simulaci FIR filtru, nebo FFT z mnoha vzorku, asi bych se rozhodne vyvaroval
for smycce. Python totiz umi byt neskutecne pomaly.


Dalsi priklad mohu uvest jednoduchou ulohu. Mate 32megabajtu 8bitovych slov, a potrebujete udelat bit swap.
Ceckari udelaji FOR loop v pythonu, vysledkem je, ze tech 32megabajtu trva asi 15 minut. Pouzijete-li 'lepsi'
algoritmus, vysledek je podstatne rychlejsi, v tomto pripade pod sekundu:

--------------------------------------------------------------------------------
#!/usr/bin/env python
import numpy as np
import random

print "Random array"
size = 8
a = np.random.randint(0,pow(2,size)-1,size=32768*1024)
#a = np.array(xrange(256))

print "Swapping"

def bitswap(vect, size):
    bitmask = tuple([pow(2,number) for number in xrange(size)])
    revmask = tuple(reversed(bitmask))

    def mapper(val):
	if val == 0:
	    return 0
	triggered = map(lambda whichbit: (val & whichbit) != 0, bitmask)
	target = [swap[0] for swap in filter(lambda item: item[1], zip(revmask,
							      triggered))]
	return reduce(lambda x,y: x+y, target)

    return map(mapper,vect)

# indexer
print "Input array length: ", len(a)
print a
index = np.array(bitswap(range(256), 8))
# lut-through output
out = index[a]
print "Output array length: ", len(out)
print out

print "Done"
----------------------------------------------------------------------


Problem je v tom, ze ti co pisi pro python musi mit neco v hlave. V cecku se spousta
algoritmickych veci promine, protoze je dabelsky rychle. Pokud chcete mit neco
rychle (bez toho dabelsky) v Pythonu, musite se zamyslet nad tim, jak to inteligentne
zakodovat, coz si myslim, ze vetsina ceckaru ... ma az na poslednim miste. Vyhodou
pythonu je to, ze v nem (dabelsky) rychle nakodujete velmi funkcni aplikace bez toho,
aby se clovek snizoval k nizsi urovni programovani (ne nadarmo se nove C++ zacina podobat pythonu :).
K tomu navic jako bonus dostanete plne dynamicky jazyk s myriadou knihoven.

V CERNu bezi na pythonu pomerne hodne sluzeb. Ja sam jej vyuzivam na ovladani svych zarizeni.
V zadnem pripade nejsem python guru, spis elektronik, ktery zjistil, co vsechno se v tom da
delat.


tolik muj jeden svycarsky centim do diskuze (a prosim zadne flame, jen jsem
chtel ukazat, v cem se ty dva pristupy lisi. samozrejme kazdy ma sve vyhody/nevyhody)



.d.




Miroslav Mraz <mrazik na volny.cz> writes:

> Ano, já vím, že jsme se na tohle téma už bavili. Zkoumat výhody 
> funkcionálního programování budu až mi někdo představí alespoň jediný 
> prakticky použitelný algoritmus, u kterého bude patrné, že funkcionální 
> přístup k jeho naprogramování má nějakou (alespoň jednu) výhodu.
>
> Mrazík
>
> Dne 13.6.2016 v 12:38 Milan B. napsal(a):
>>
>> Ako povedal klasik: fortranovsky program sa da napisat v akomkolvek
>> jazyku (http://web.mit.edu/humor/Computers/real.programmers).
>>
>> Python obsahuje mnoho prvkov prevzatych z funkcionalnych jazykov:
>> zoznamy, funkcie vyssieho radu, lambda kalkulus... a z toho vyplyva iny
>> styl programovania pre tych, ktori tieto vlastnosti vedia a chcu vyuzit.
>>
>> Keby ste si pozreli ten FP101 kurz o funkcionalnom programovani, ako som
>> odporucal, tak by ste to v tom Pythone videli.
>>
>> -m-
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list


Další informace o konferenci Hw-list