Temat 3: Powtórzenie
Wstecz; Ostatnia modyfikacja: 19.03.2015
- Organizacja pracy, alternatywne podejścia:
- programujemy bezpośrednio na serwerze.
- Zalety: nie tracimy czasu na wysyłanie kodu; piszemy kod w środowisku w którym będzie uruchamiany.
- Wady: problematyczna praca gdy nie mamy internetu; zwykle konieczność korzystania z tekstowych IDE (vi, vim).
- programujemy lokalnie, wysyłamy kod na
serwer tylko na potrzeby uruchomienia obliczeń.
- Zalety: pracujemy w ulubionym IDE.
- Wady: dodatkowy krok wysyłania kodu na serwer.
- Systemy kontroli wersji. Obecnie popularne są SVN i git, przy czym rośnie popularność git - jądro Linuxa jest na GitHubie. Darmowe repozytoria prywatne
git na
BitBucket.
- Powtórzenie: przykładowe rozwiązanie wykorzystujące textutils:
#curl "http://scop.berkeley.edu/astral/subsets/?ver=2.05&get=sc&seqOption=0&item=verbose&cut=sp" > astral.txt
#curl "http://scop.berkeley.edu/downloads/parse/dir.des.scope.2.05-stable.txt" > scop.txt
cat scop.txt | cut -f 3-4 --output-delimiter=" " | grep -v "[-#]" | sort -k 2 > sc_fam.txt
cat astral.txt | cut -c 6- |grep -v "^$" | cut -d ")" -f 1 | cut -d " " -f 1,4 | sort -k 1 | cut -d " " -f 1,2 > as_fam.txt
join -1 2 -2 1 sc_fam.txt as_fam.txt > join.txt
cat join.txt | sort -r -k3 | sort -sru -k2,2 > final.txt
#time ./sol.sh
#real 0m3.371s
#user 0m3.473s
#sys 0m0.086s
Przystępne wprowadzenie do narzędzi unixowych: grymoire
Przykład kodu w Pythonie rozwiązującego to
samo zadanie (przeanalizować):
def readAstral(input_fn):
input_fh = open(input_fn)
lines = input_fh.readlines()
input_fh.close()
astral = {}
for line in lines:
line = line.strip() #usuwamy znak konca linii
line = line.strip(")") #usuwamy nawias
tokens = line.split()
if len(tokens) < 1:
continue
domain_id = tokens[-4]
score = float(tokens[-1])
astral[domain_id] = score
return astral
def readSCOP(input_fn):
input_fh = open(input_fn)
lines = input_fh.readlines()
input_fh.close()
scop = {}
for line in lines:
line = line.strip()
if line.startswith("#"): #pomijamy linie komentarza
continue
tokens = line.split("\t")
fam_id, domain_id = tokens[2:4]
if domain_id == "-":
continue
if not fam_id in scop:
scop[fam_id] = set([])
scop[fam_id].add(domain_id)
return scop
def combine(astral, scop):
res = []
MIN = -100000
for fam_id in scop.keys():
best_domain_id = ""
best_score = MIN
for domain_id in scop[fam_id]:
score = astral.get(domain_id, MIN)
if score > best_score:
best_score = score
best_domain_id = domain_id
if len(best_domain_id) > 0:
res.append((fam_id, best_domain_id, best_score))
return res
astral = readAstral("astral.txt")
scop = readSCOP("scop.txt")
result = combine(astral, scop)
for (fam_id, domain_id, score) in result:
print(" ".join([domain_id, fam_id, str(score)]))
# time python sol2.py > final_py.txt
# real 0m0.625s
# user 0m0.596s
# sys 0m0.028s
Dyskusja wad i zalet obu podejść.
Przykładowe zalety bash:
- szybka implementacja prostych programów
- szybkie prototypowanie
- możliwość szybkiej weryfikacji hipotez
Przykładowe wady basha względem Pythona:
- kod trudny do zrozumienia dla innych i
siebie po pewnym czasie
(brak sugestywnych nazw zmiennych)
- problematyczna re-używalność kodu - zwykle nie
robimy backapu wpisywanych komend bashowych
- brak wieloplatformowości
Generalna konkluzja: im więcej znamy technik programowania, tym lepiej.
Python: rozsądna alternatywa pomiędzy
bashem a językami jak Java czy C++.