Forum » Programiranje » [python]kaj je hitreje
[python]kaj je hitreje
Isotropic ::
narediti moram neke izracune (preproste) nad veliko kolicino podatkov, rezultate pa zapisati v file. problem je, da je teh podatkov kar veliko, tko da traja dolgo casa.
zanima me, kateri pristop je hitrejsi:
-preallocate nested list, izracunam in shranim not, zapisem v datoteko vse v enem susu
-loop, se zapeljem cez podatke, racunam in hkrati pisem v file
datoteka ima ene 100 znakov na vrstico, velikost je bila pa pri manjsem modelu 12mb (ta sedaj bi znal biti ene 2-3x vecji).
no, st. podatkov je ~170k * 3, moram jih pa zapisati 2x, v drugem passu moram izvesti se neke dodatne zadeve.
zdaj program sam je sicer preprost, bi pa prepis v cpp vzel prevec casa, tko da ni neka moznost
malo editano. za 5mb rabi kaksne pol.
zanima me, kateri pristop je hitrejsi:
-preallocate nested list, izracunam in shranim not, zapisem v datoteko vse v enem susu
-loop, se zapeljem cez podatke, racunam in hkrati pisem v file
datoteka ima ene 100 znakov na vrstico, velikost je bila pa pri manjsem modelu 12mb (ta sedaj bi znal biti ene 2-3x vecji).
no, st. podatkov je ~170k * 3, moram jih pa zapisati 2x, v drugem passu moram izvesti se neke dodatne zadeve.
zdaj program sam je sicer preprost, bi pa prepis v cpp vzel prevec casa, tko da ni neka moznost
malo editano. za 5mb rabi kaksne pol.
- spremenil: Isotropic ()
noraguta ::
vedo je hitreje če v memoriji poračunaš pa na enkrat zapišeš, če le gre cela zadeva v spomin, čene pa po kosih.
Pust' ot pobyedy k pobyedye vyedyot!
Invictus ::
Na današnjih računalnik je popolnoma vseeno kako to narediš, ker bo delal maksimalno 5 minut.
Razen če tega ne ponavljaš vsakih 30 minut.
Če rabiš to samo enkrat, potem izberi najhitrejšo pot do kode, računalnik lahko računa tudi ponoči.
12 MB podatkov ni nič (če jih dela računalnik).
LP I.
Razen če tega ne ponavljaš vsakih 30 minut.
Če rabiš to samo enkrat, potem izberi najhitrejšo pot do kode, računalnik lahko računa tudi ponoči.
12 MB podatkov ni nič (če jih dela računalnik).
LP I.
repo ::
mja, zdaj sem si dal en counter, da mi izpisuje vsak loop
naredi mi jih > 100 v sekundi, s tem da glede na to, da je to python, se po mojem nimam kaj pritozevati. bo pac malo trajalo do 500k
pisanje v file niti ni tak problem, vecji je racunanje, kjer se vidi, da je bottleneck (zdaj lavfam na enem manjsem modelu)
edit: pomotoma prijavljen pod kolegovim accountom
naredi mi jih > 100 v sekundi, s tem da glede na to, da je to python, se po mojem nimam kaj pritozevati. bo pac malo trajalo do 500k
pisanje v file niti ni tak problem, vecji je racunanje, kjer se vidi, da je bottleneck (zdaj lavfam na enem manjsem modelu)
edit: pomotoma prijavljen pod kolegovim accountom
Zgodovina sprememb…
- spremenilo: repo ()
BigWhale ::
Kaj hudica pa racunas, da toliko casa traja? Izpise takoj ugasnit, ker upocasnjujejo zadevo. :)
Sicer pa paralelizirat zadevo, ce se da. Verjetno se da, ce sproti zapisujes zadeve v file.
Sicer pa paralelizirat zadevo, ce se da. Verjetno se da, ce sproti zapisujes zadeve v file.
noraguta ::
Kaj hudica pa racunas, da toliko casa traja? Izpise takoj ugasnit, ker upocasnjujejo zadevo. :)
Sicer pa paralelizirat zadevo, ce se da. Verjetno se da, ce sproti zapisujes zadeve v file.
če gre za sosledje zapisov v dveh fazah to ni vedno trivialen problem. se pa tudi meni poraja vprašanje glede računske zahtevnosti glede na I/O.
Pust' ot pobyedy k pobyedye vyedyot!
Isotropic ::
resultFull = [ []*10 for i in range(len(db['cohesive'].keys())*3) ] #data = [ [0] * 10 ] * len(db['cohesive'].keys())*3 num = 0 for el in db['cohesive'].keys(): for es in db['elementSet']: check = set([i[0] for i in db['elementSet'][es]]) if el in check: final = es break #for el in temp2: #print el pt1 = getCoords(db['cohesive'][el]['nodes'][0]) pt2 = getCoords(db['cohesive'][el]['nodes'][1]) pt3 = getCoords(db['cohesive'][el]['nodes'][2]) a = [(pt2[0] - pt1[0]), (pt2[1] - pt1[1]), (pt2[2] - pt1[2])] b = [(pt3[0] - pt1[0]), (pt3[1] - pt1[1]), (pt3[2] - pt1[2])] normal = cross2(a,b) n1 = getFirstDirection(pt1, pt2, pt3) n2 = cross2(normal, n1) stress = [getStress(sM, normal, normal), getStress(sM, normal, n1), getStress(sM, normal, n2)] for i in range(3): temp = 'int' + str(i+1) resultFull[num] = [final[0], final[1], el, i+1, db['cohesive'][el][temp][0], db['cohesive'][el][temp][2], db['cohesive'][el][temp][4], stress[0], stress[1], stress[2]] num += 1 #print num if num%10000 == 0: print num def getStress(sM, normal, vec): p = matmult(sM, normal) return dot(p, vec) def matmult(m, v): rows = len(m) w = [0]*rows irange = range(len(v)) sum = 0 for j in range(rows): r = m[j] for i in irange: sum += r[i]*v[i] w[j],sum = sum,0 return w return [v[0] - dot(v,n)*n[0], v[1] - dot(v,n)*n[1], v[2] - dot(v,n)*n[2]] def getFirstDirection(n1, n2, n3): a = [(n2[0] - n1[0]), (n2[1] - n1[1]), (n2[2] - n1[2])] b = [(n3[0] - n1[0]), (n3[1] - n1[1]), (n3[2] - n1[2])] n = cross2(a, b) angle = getAngle([1,0,0], n) if angle <= 0.1: temp = projectVectorToPlane(a, b, [0,0,1]) norm = sqrt(temp[0]**2 + temp[1]**2 + temp[2]**2) return [temp[0]/norm, temp[1]/norm, temp[2]/norm] else: temp = projectVectorToPlane(a, b, [1,0,0]) norm = sqrt(temp[0]**2 + temp[1]**2 + temp[2]**2) return [temp[0]/norm, temp[1]/norm, temp[2]/norm]
jaz sicer sumim matmult() - mnozenje matrike z vektorjem - rotacija le-te v lokalni koord. sistem v bistvu, vendar nisem izvajal nobenih benchmarkov. je pa len(db['cohesive'].keys()) 170k, torej je vseh izracunov 3x vec.
se jih pa naredi ene 100/s od oka. btw, a ni python vezan samo na en core (bigwhale, ko je omenjal paralelizacijo). ce bi se to se dodatno razbilo na threade, bi bilo pomoje samo se slabse.
Zgodovina sprememb…
- spremenil: Isotropic ()
Spura ::
Naredi benchmarke, da ugotovis kateri del kode ti pobere najvec. 100 na sec je ful malo kljub temu da je python.
Ze tale operacija mi je sumljiva:
if el not in listEl:
in pa tukaj:
pt1 = getCoords(db['cohesive'][el]['nodes'][0])
pt2 = getCoords(db['cohesive'][el]['nodes'][1])
pt3 = getCoords(db['cohesive'][el]['nodes'][2])
lahko db['cohesive'][el]['nodes'] izvozis v eno spremenljivko, da tega ne evaluateas trikrat.
neki = db['cohesive'][el]['nodes']
pt1 = neki[0] etc...
Ze tale operacija mi je sumljiva:
if el not in listEl:
in pa tukaj:
pt1 = getCoords(db['cohesive'][el]['nodes'][0])
pt2 = getCoords(db['cohesive'][el]['nodes'][1])
pt3 = getCoords(db['cohesive'][el]['nodes'][2])
lahko db['cohesive'][el]['nodes'] izvozis v eno spremenljivko, da tega ne evaluateas trikrat.
neki = db['cohesive'][el]['nodes']
pt1 = neki[0] etc...
Zgodovina sprememb…
- spremenil: Spura ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Casovna kompleksnost algoritmaOddelek: Programiranje | 1455 (1210) | lebdim |
» | [Python] Pomoč pri računanju Pi-jaOddelek: Programiranje | 2476 (2108) | Spura |
» | [Java] Zagon appleta v HTMLOddelek: Programiranje | 1547 (1369) | Bela01 |
» | [JAVA] branje iz datotekeOddelek: Programiranje | 2414 (2049) | Bela01 |
» | Iskanje podvojenih zaporedijOddelek: Programiranje | 1870 (1650) | Gundolf |