» »

[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.

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!

Isotropic ::

malo editano

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.

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

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.

noraguta ::

BigWhale je izjavil:

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…

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...

Zgodovina sprememb…

  • spremenil: Spura ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Casovna kompleksnost algoritma

Oddelek: Programiranje
71438 (1193) lebdim
»

[Python] Pomoč pri računanju Pi-ja

Oddelek: Programiranje
202454 (2086) Spura
»

[Java] Zagon appleta v HTML

Oddelek: Programiranje
161539 (1361) Bela01
»

[JAVA] branje iz datoteke

Oddelek: Programiranje
242406 (2041) Bela01
»

Iskanje podvojenih zaporedij

Oddelek: Programiranje
91853 (1633) Gundolf

Več podobnih tem