Forum » Programiranje » [Python] učenje
[Python] učenje
Robocop1 ::
Pozdravljeni!
Sem nov v Pythonu in bom potreboval malo pomoči. Pregledal sem že tutoriale na tem forumu, a nisem našel to kar me zanima.
Za začetek bi rad izvedel kako združim več stavkov v nek blok. Rad bi z zanko napisal program, ki bi izpisal nekaj podobnega:
*****
*****
*****
Bi mi lahko kdo napisal kodo, ki to izpiše?
Sem nov v Pythonu in bom potreboval malo pomoči. Pregledal sem že tutoriale na tem forumu, a nisem našel to kar me zanima.
Za začetek bi rad izvedel kako združim več stavkov v nek blok. Rad bi z zanko napisal program, ki bi izpisal nekaj podobnega:
*****
*****
*****
Bi mi lahko kdo napisal kodo, ki to izpiše?
b0j3 ::
Pa napiši predlog kako naj bi zgledal potek programa, da pokažeš vsaj malo dobre volje.
Sedaj izgleda kot da hočeš, da naredimo tvojo domačo nalogo.
Sedaj izgleda kot da hočeš, da naredimo tvojo domačo nalogo.
bluefish ::
Glede na prejšnje teme se gre očitno res za reševanje nalog: http://slo-tech.com/script/forum/izpisi...
Robocop1 ::
Sicer ne gre za domačo nalogo (učim se ga, ker ga bom najverjetneje potreboval v bližnji prihodnosti). Moj do sedaj napisan program je takšen:
for i in range (0, 3):
for j in range (0, 5):
print("*")
print("\n")
Problem je v tem, da se oba print ukaza izvedeta zaporedno, zato imam pri izpisu vsako zvezdico v svoji vrstici. Pa tudi če napišem samo:
print("*")
print("*")
bo vsaka zvezdica v novi vrstici, čeprav nisem zahteval skoka v novo vrstico. Je sploh možno napisati program, kot sem si ga zgoraj zamislil?
for i in range (0, 3):
for j in range (0, 5):
print("*")
print("\n")
Problem je v tem, da se oba print ukaza izvedeta zaporedno, zato imam pri izpisu vsako zvezdico v svoji vrstici. Pa tudi če napišem samo:
print("*")
print("*")
bo vsaka zvezdica v novi vrstici, čeprav nisem zahteval skoka v novo vrstico. Je sploh možno napisati program, kot sem si ga zgoraj zamislil?
imagodei ::
Indentaj program:
for i in range(0,3): for j in range(0,5): print("*", end=" ") print("\n")
- Hoc est qui sumus -
noname3 ::
za python imaš veliko dobrih tutorialov na spletu - v angleščini.
preberi jih in sigurno boš našel odgovore na veliko vprašanj...
preberi jih in sigurno boš našel odgovore na veliko vprašanj...
Isotropic ::
dajte se meni nekaj povedat
je ta break pravilno uporabljen? rad bi, da v primeru, da najde match, gre ven iz j loopa in se pomakne na nov element (i).
pa bi se dalo loopa se kako izboljsati performancno (problem je, da sta ZELO velika), ker tece ze kar nekaj casa.
bi slo z sorted in sklicevanje na prvi field, potem pa samo primerjam vrednosti in ce nista enaki, grem skozi celo dvojno zanko.
for i in range(0, len(element)): for j in range(0, len(field.values), 3): if element[i][0] == field.values[j].elementLabel: element[i].append(array('d', [field.values[j].data, field.values[j+1].data, field.values[j+2].data])) break else: continue
je ta break pravilno uporabljen? rad bi, da v primeru, da najde match, gre ven iz j loopa in se pomakne na nov element (i).
pa bi se dalo loopa se kako izboljsati performancno (problem je, da sta ZELO velika), ker tece ze kar nekaj casa.
bi slo z sorted in sklicevanje na prvi field, potem pa samo primerjam vrednosti in ce nista enaki, grem skozi celo dvojno zanko.
Isotropic ::
saj to bi rad ja. loop i se more se nadaljevati.
sicer pa ni bil dober nacin, ker je trajalo vec kot pol ure, da je slo skozi ~15% i.
(i=~1e5, j=6e5/3)
sicer pa ni bil dober nacin, ker je trajalo vec kot pol ure, da je slo skozi ~15% i.
(i=~1e5, j=6e5/3)
Zgodovina sprememb…
- spremenil: Isotropic ()
noname3 ::
dajte se meni nekaj povedat
for i in range(0, len(element)): for j in range(0, len(field.values), 3): if element[i][0] == field.values[j].elementLabel: element[i].append(array('d', [field.values[j].data, field.values[j+1].data, field.values[j+2].data])) break else: continue
je ta break pravilno uporabljen? rad bi, da v primeru, da najde match, gre ven iz j loopa in se pomakne na nov element (i).
pa bi se dalo loopa se kako izboljsati performancno (problem je, da sta ZELO velika), ker tece ze kar nekaj casa.
bi slo z sorted in sklicevanje na prvi field, potem pa samo primerjam vrednosti in ce nista enaki, grem skozi celo dvojno zanko.
break je pravilno uporabljen, samo ne razumem zakaj rabis "else: continue"? razen če imaš nekaj za tem if-om v notranjem loop-u?
optimizacijo lahkio naredis da najprej sortiras values listo po elementLabel in gres preverat polovico po polovico - podobno kako dela qsort.
jype ::
Predvsem to ni naloga za Python. Take reči je smiselno delat v C modulu za Python, če že moraš v Pythonu.
imagodei ::
@jype
Zakaj - ker je Python prešvoh/prepočasen, ali ker enostavno ni opremljen za tovrstne naloge?
Zakaj - ker je Python prešvoh/prepočasen, ali ker enostavno ni opremljen za tovrstne naloge?
- Hoc est qui sumus -
jype ::
Ker gre za ogromen loop. Hočeš, da je čimbolj tight, da se na procesorju izvaja čim manj ukazov na vsako iteracijo.
Če se to dogaja v Python kodi, je (interpreterjevih) režijskih stroškov toliko, da nima nobenega smisla.
Napišeš funkcijo v C ki ji v Pythonu podaš objekte in potem loopaš v C, približno 400-3000x hitreje.
Če se to dogaja v Python kodi, je (interpreterjevih) režijskih stroškov toliko, da nima nobenega smisla.
Napišeš funkcijo v C ki ji v Pythonu podaš objekte in potem loopaš v C, približno 400-3000x hitreje.
imagodei ::
Hm,
a nima drugač piton kakšnega kompajlerja? Sicer vem, da je v osnovi interpretiran jezik, ampak mislim, da swm vseeno nekaj zasledil...
a nima drugač piton kakšnega kompajlerja? Sicer vem, da je v osnovi interpretiran jezik, ampak mislim, da swm vseeno nekaj zasledil...
- Hoc est qui sumus -
Isotropic ::
ne znam c
zdaj sice nekaj gledam, da bi sortiral oba lista, pa field sem dal v svoj list samo te value (ker je moral zdaj dostopati do baze podatkov za vsak j, kar je costly), potem pa najprej primerjal, ce mi bo ratalo (ker so/bodo itak po vrsti), ce pa ne, pa pac search po celem listu.
pa tudi receno mi je bilo, da se za takle ne splaca pisat v c, ker je samo kratka skripta
zdaj sice nekaj gledam, da bi sortiral oba lista, pa field sem dal v svoj list samo te value (ker je moral zdaj dostopati do baze podatkov za vsak j, kar je costly), potem pa najprej primerjal, ce mi bo ratalo (ker so/bodo itak po vrsti), ce pa ne, pa pac search po celem listu.
pa tudi receno mi je bilo, da se za takle ne splaca pisat v c, ker je samo kratka skripta
Zgodovina sprememb…
- spremenil: Isotropic ()
hruske ::
Najbolj enostavno to pohitriš tako, da ne uporabljaš indeksov, ampak kar elemente. Odstranil sem še tisti continue, ker ne spremeni algoritma.
S tem si se znebil dveh iskanj po seznaku, ki so v Pythonu še kar draga operacija.
for i in element: for j in range(0, len(field.values), 3): if i[0] == field.values[j].elementLabel: i.append(array('d', [field.values[j].data, field.values[j+1].data, field.values[j+2].data])) break
S tem si se znebil dveh iskanj po seznaku, ki so v Pythonu še kar draga operacija.
Kalkulator nove omrežnine 2024 - https://omreznina.karlas.si/Kalkulator
Zgodovina sprememb…
- spremenilo: hruske ()
Isotropic ::
hm, sam res. to pa niti pomislil nisem.
btw, receno mi je bilo, da append porabi tudi veliko casa, ker se mora narediti nov list, vse prepisat not pa starega unict (vsakic).
a to popravim tkao, da ga na zacetku inicializiram (dolzina je znana) ali da mu priredim vrednost takole list[i][0] = ... (sklepam, da je append in tole isto sicer)
edit ni, tisto je insert, ce se ne motim.
btw, receno mi je bilo, da append porabi tudi veliko casa, ker se mora narediti nov list, vse prepisat not pa starega unict (vsakic).
a to popravim tkao, da ga na zacetku inicializiram (dolzina je znana) ali da mu priredim vrednost takole list[i][0] = ... (sklepam, da je append in tole isto sicer)
edit ni, tisto je insert, ce se ne motim.
hruske ::
Ne, to, da se ustvarja nov list vsakič ko dodaš kak element v Pythonu ni čisto res. Gre sicer po nekem eksponentnem povečevanju prostora.
Je pa res, da se v primeru vnaprej znane velikosti lahko temu izogneš in narediš nov list tako (N je velikost)
dodeljevanje je list[i] = nov_element
insert je list.insert(i, nov_element)
append je list.append(nov_element)
Je pa res, da se v primeru vnaprej znane velikosti lahko temu izogneš in narediš nov list tako (N je velikost)
list = [None]*N
dodeljevanje je list[i] = nov_element
insert je list.insert(i, nov_element)
append je list.append(nov_element)
Kalkulator nove omrežnine 2024 - https://omreznina.karlas.si/Kalkulator
hruske ::
Ok, zdaj pa še en uber trik.
No, in s tem se znebiš še iskanj po seznamu po indeksih j, zdaj pa bi se moralo to že konkretno poznat na hitrosti.
from itertools import izip def grouper(n, iterable): "ta funkcija vraca po n elementov seznama hkrati" # naslednja vrstica naredi list z "n" elementi, od katerih vsi # kažejo na isti generator zato se ob vsakem dostopu do drugega # generatorja, ki ga vrne izip, vracajo po 1 element od vsakega # elementa v args, to pa je ravno n elementov seznama "iterable", # ki si sledijo po vrsti. args = [iter(iterable)] * n return izip(*args) for i in element: for j in grouper(3, field.values): if i[0] == j[0].elementLabel: i.append(array('d', [x.data for x in j])) break
No, in s tem se znebiš še iskanj po seznamu po indeksih j, zdaj pa bi se moralo to že konkretno poznat na hitrosti.
Kalkulator nove omrežnine 2024 - https://omreznina.karlas.si/Kalkulator
Zgodovina sprememb…
- spremenilo: hruske ()
noname3 ::
Ok, zdaj pa še en uber trik.
from itertools import izip def grouper(n, iterable): "ta funkcija vraca po n elementov seznama hkrati" # naslednja vrstica naredi list z "n" elementi, od katerih vsi # kažejo na isti generator zato se ob vsakem dostopu do drugega # generatorja, ki ga vrne izip, vracajo po 1 element od vsakega # elementa v args, to pa je ravno n elementov seznama "iterable", # ki si sledijo po vrsti. args = [iter(iterable)] * n return izip(*args) for i in element: for j in grouper(3, field.values): if i[0] == j[0].elementLabel: i.append(array('d', [x.data for x in j])) break
No, in s tem se znebiš še iskanj po seznamu po indeksih j, zdaj pa bi se moralo to že konkretno poznat na hitrosti.
cool, za ta iterootl nisem vedel.
sam, ali si siguren da tole nekaj pohitri...
Zgodovina sprememb…
- spremenil: noname3 ()
Isotropic ::
evo
tisti list je v bistvu field.values.data temp variabla, me pa zanima, ce lahko kdo to prepise, da bo bolj po pythonovsko, sploh glede tistega i. sem videl, da ga kar omittate (i), meni na zacetku ni delalo tako (sem narobe zastavil), pa sem se navadil na dolgo. lavfalo je pa < 2min.
pa ce lahko pojasni kdo tisto lambdo, sem jo dobil od enega sodelavca, ki je rekel, da jo je vcasih se razumel.
cmp( x, y)
Compare the two objects x and y and return an integer according to the outcome. The return value is negative if x < y, zero if x == y and strictly positive if x > y.
zdaj ce prav razumem, primerja vsak element z 0,0 in ce je manjsi, ga premakne gor.
element.sort(lambda z,x: cmp(z[0],x[0])) list.sort(lambda z,x: cmp(z[0],x[0])) for i in range(len(element)): if element[i][0] == list[i][0]: element[i].append(array('d', [list[i][1], list[i][2], list[i][3]])) else: print i
tisti list je v bistvu field.values.data temp variabla, me pa zanima, ce lahko kdo to prepise, da bo bolj po pythonovsko, sploh glede tistega i. sem videl, da ga kar omittate (i), meni na zacetku ni delalo tako (sem narobe zastavil), pa sem se navadil na dolgo. lavfalo je pa < 2min.
pa ce lahko pojasni kdo tisto lambdo, sem jo dobil od enega sodelavca, ki je rekel, da jo je vcasih se razumel.
cmp( x, y)
Compare the two objects x and y and return an integer according to the outcome. The return value is negative if x < y, zero if x == y and strictly positive if x > y.
zdaj ce prav razumem, primerja vsak element z 0,0 in ce je manjsi, ga premakne gor.
Zgodovina sprememb…
- spremenil: Isotropic ()
Isotropic ::
kako naj naredim vec if stavkov oz. po vecih kriterijih?
rad bi izpisal vse elemente, ki imajo x v rangu (0.20 - 0.21) in y v rangu (0.2-0.22)?
ok, vem da se to da narediti z list comp., samo ne vem, kako naj refenciram ustrezno kolumno lista. mam nekako tko, ampak ne dela (obviously):
[elem for elem in result where result[2] in range(0.2,0.21)]
rad bi izpisal vse elemente, ki imajo x v rangu (0.20 - 0.21) in y v rangu (0.2-0.22)?
ok, vem da se to da narediti z list comp., samo ne vem, kako naj refenciram ustrezno kolumno lista. mam nekako tko, ampak ne dela (obviously):
[elem for elem in result where result[2] in range(0.2,0.21)]
Zgodovina sprememb…
- spremenil: Isotropic ()
Kami ::
Uporabiš and oziroma oz, odvisno od potrebe.
Na primer:
[elem for elem in result if elem[x] in range(2, 5) and elem[y] in range(5,9)]
...
Na primer:
[elem for elem in result if elem[x] in range(2, 5) and elem[y] in range(5,9)]
...
hruske ::
Pomojem hočeš:
ker je range diskretna stvar in ne gleda zveznih vrednosti.
[elem for elem in result if (0.2 <= result.x <= 0.21) and (0.2 <= result.y <= 0.22)]
ker je range diskretna stvar in ne gleda zveznih vrednosti.
Kalkulator nove omrežnine 2024 - https://omreznina.karlas.si/Kalkulator
Isotropic ::
ce se ne motim, ima py neko omejitev, da lahko lavfa threade samo na enem procesorju/ coreu, kajne (samo lahko pa na tem procu izvaja n threadov)?
ve kdo kaj o tem?
se mi bolj splaca lavfat en thread ali vec (performacno)? vse kar delam, je primerjava nekih vnosov v listu.
dam se kodo:
vem, da py ni najboljsa izbira, ampak problem je ze v tem, da ne znam nic drugega, razen malo fortrana. preden bi pa skapiral, kako in kaj, bi pa tudi py ze naredil.
ve kdo kaj o tem?
se mi bolj splaca lavfat en thread ali vec (performacno)? vse kar delam, je primerjava nekih vnosov v listu.
dam se kodo:
for i in listBg: for j in tmp[i].elements: elBg.append([j.label]) elBg[-1].extend(j.connectivity) for i in listCoh: for j in tmp[i].elements: elCoh.append([j.label]) elCoh[-1].extend(j.connectivity) elBg.sort(lambda z,x: cmp(z[0],x[0])) elCoh.sort(lambda z,x: cmp(z[0],x[0])) stevec = [[0]*2 for num in range(len(elCoh))] for i in range(len(elCoh)): for j in range(len(elBg)): bgg = elBg[1:] if elCoh[i][1] in bgg and elCoh[i][2] in bgg and elCoh[i][2] in bgg or \ elCoh[i][4] in bgg and elCoh[i][5] in bgg and elCoh[i][6] in bgg: s = stevec[i][1] + 1 stevec.append([elCoh[i][0], s])
vem, da py ni najboljsa izbira, ampak problem je ze v tem, da ne znam nic drugega, razen malo fortrana. preden bi pa skapiral, kako in kaj, bi pa tudi py ze naredil.
Zgodovina sprememb…
- spremenil: Isotropic ()
hruske ::
Performančno na CPythonu (uradna python.org implementacija) definitivno single thread. Če imaš večjedrni CPU to velja še toliko bolj.
Threadi v Pythonu niso primerni za procesno intenzivne stvari.
Threadi v Pythonu niso primerni za procesno intenzivne stvari.
Kalkulator nove omrežnine 2024 - https://omreznina.karlas.si/Kalkulator
Isotropic ::
lahko poves, ce se da dobiti kako direktorij, v katerem se nahaja skripta, ki je bila pognana? (zazene se z python c:\...). zdaj resujem to z rocnim vpisom, me pa zanima, ce se da kako boljse?
kaj pa je bolj primerno za intenzivne zadeve, v pure pythonu? cpp ne znam, scipy ipd. pa ni moznosti za instalacijo (nimamo linux admina, pa ce gre kaj narobe...)
kaj pa je bolj primerno za intenzivne zadeve, v pure pythonu? cpp ne znam, scipy ipd. pa ni moznosti za instalacijo (nimamo linux admina, pa ce gre kaj narobe...)
Gandalfar ::
easy_install scipy
pa si ga instaliras v osebni home instaliraj. Python prakticno nikoli ne rabi admin privilegijev.
pa si ga instaliras v osebni home instaliraj. Python prakticno nikoli ne rabi admin privilegijev.
Zgodovina sprememb…
- spremenil: Gandalfar ()
jype ::
loki3000> lahko poves, ce se da dobiti kako direktorij, v katerem se nahaja skripta, ki je bila pognana?
__file__
__file__
Zgodovina sprememb…
- spremenilo: jype ()
Isotropic ::
kako je pa mozno, da mi samo tale koda (vse, ampak cisto vse ostalo je zakomentirano). vrne pa typeError: an integer is required. sem skopiral tudi iz neke druge kode, file je na direktoriju, kjer bi mogel lavfat, take datoteke se ni (sem tudi mal probal spremenit), placa je se dost.
sem probal dat stop med f in for (da javi napako), a je ni. ce sem dal stop pred f, je javil napako. definiran je tudi samo files, f pa ni vec, kaj sele item (kot type(item))
import __builtin__ je pomagal.
#from os import * from odbAccess import * #pathh = '' #pot do direktorija #files = listdir(pathh) #files = [i for i in files if 'odb' in i] files = ['new6.odb', 'new6reversed.odb'] f = open('result_iso.txt', 'w') #for item in files:
sem probal dat stop med f in for (da javi napako), a je ni. ce sem dal stop pred f, je javil napako. definiran je tudi samo files, f pa ni vec, kaj sele item (kot type(item))
import __builtin__ je pomagal.
Zgodovina sprememb…
- spremenil: Isotropic ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [Python + Numpy] 4D array in izbira elementovOddelek: Programiranje | 1702 (1189) | bluefish |
» | Python - pomoč (strani: 1 2 3 )Oddelek: Programiranje | 18145 (8893) | black ice |
⊘ | python pomočOddelek: Programiranje | 3423 (2344) | Mavrik |
» | python problemOddelek: Programiranje | 1471 (1211) | Isotropic |
» | Python - nalogaOddelek: Programiranje | 2810 (2494) | jype |