Portál AbcLinuxu, 27. dubna 2024 02:47


Dotaz: jak na efektivni vstup v pythonu?

13.12.2005 12:08 Martin Beránek | skóre: 33 | blog: mousehouse | Brno
jak na efektivni vstup v pythonu?
Přečteno: 68×
Odpovědět | Admin

zdravím, v pythonu začínám a nemám takový přehled o jazyce a knihovnách

Řešil jsem problém s parsováním textového vstupu (text oddělený rourama, ale na každém řádku jiný počet sloupců a také některé položky obsahovaly znak '\r') - takže celkem legrace

Jeden "blok" (nebudu říkat řádek, protože to není prvada) vypadá třeba takhle:

|START|ahoj |  text|zase
nejaky   text
   ktery je docela
 dlouhy| polozka|STOP|

základní smyčka programu načítá tento jeden blok (jediné co vím, že začíná přesně |START| a končí přesně |STOP|) pomocí sys.stdin.read(1). jednotlivé položky ukládám do pole, které po přečtení jednoho bloku zpracuji a vyhodím na výstup

dneska sem ale zjistil, ze na vstupu budou asi 4GB (pri soucasnem vykonu by to trvalo asi 8h), takze: jak zefektivnit vstup? (docela by to chtelo :-) )/p>

never use rm after eight
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

13.12.2005 12:37 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
Rozbalit Rozbalit vše Re: jak na efektivni vstup v pythonu?
Odpovědět | | Sbalit | Link | Blokovat | Admin
jednotlivé položky ukládám do pole, které po přečtení jednoho bloku zpracuji a vyhodím na výstup
Otázka zní jinak, co to znamená zpracuje? Je možné zpracovat jeden token a ihned ho vypsat, nebo je potřeba mít celý soubor načtený v poli a až potom zpracovávat? Je možné třeba pustit čtení v jednom vláknu a zpracovávání (po načtení nějakého minimálního vstupu) ve druhém?

BTW: pokud je výkon kritický a budeš zpracovávat 4GB soubory, poohlédl bych se spíše po C.
When your hammer is C++, everything begins to look like a thumb.
13.12.2005 13:02 Martin Beránek | skóre: 33 | blog: mousehouse | Brno
Rozbalit Rozbalit vše Re: jak na efektivni vstup v pythonu?
jak sem psal:
které po přečtení jednoho bloku zpracuji a vyhodím na výstup
asi sem se zeptal spatne: jak moc je v pythonu efektivni sys.stdin.read(1) ?

ja jsem spise javista... takze do Ccka bych se vubec nehrnul :-) - radeji mam jazyky vyssi urovne
never use rm after eight
13.12.2005 15:20 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
Rozbalit Rozbalit vše Re: jak na efektivni vstup v pythonu?
Jde mi o to, zda se do pole blok (4GB blok?) neukládá zbytečně a nedá se hned poslat na výstup. Mě z tvého popisu napadlo, že kód většinu času tráví ukládáním po paměti a tím zpracováváním - chtělo by to profilovat.

Jinak efektivitu sys.stdin.read(1) si můžeš snadno změřit (a porovnat třeba s Perlem, Javou, ...) přiznám se, že by mě výsledky zajímaly.
$ seq 1000000 > milion.txt
$cat read
#!/usr/bin/python

import sys
while (sys.stdin.read(1)):
  pass

$ time cat milion.txt | ./read

real    0m13.338s
user    0m13.233s
sys     0m0.068s
When your hammer is C++, everything begins to look like a thumb.
13.12.2005 15:50 Martin Beránek | skóre: 33 | blog: mousehouse | Brno
Rozbalit Rozbalit vše Re: jak na efektivni vstup v pythonu?
dělám chybu a vím o tom:

základní pravidlo optimalizace: neoptimalizovat... a asi u toho zůstanu... bez profilovacího nástroje stejne nevim kde mi to zere cas, takze...

spise sem cekal jestli se nekdo neozve treba takhle: no fuj, nacitat to po znacich, to je ale prasarna - nikdo se takhle neozval, tudiz povazuji tuhle metodu za beznou (at je nebo neni efektivni) - treba v jave se to realizuje pomoci BufferedReader a ten zajistuje efektivnejsi vyuziti zarizeni
never use rm after eight
13.12.2005 13:04 Martin Beránek | skóre: 33 | blog: mousehouse | Brno
Rozbalit Rozbalit vše Re: jak na efektivni vstup v pythonu?
jinak v jave s vlaknama bezne delam, ale -- jak sem psal -- v pythonu zacinam, tak se do vlaken asi pustet nebudu (na srozumitelnstoi programu to asi moc neprida), a asi to ani nema v tomhle pripade cenu
never use rm after eight
13.12.2005 19:34 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: jak na efektivni vstup v pythonu?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jestliže jsi vše pečlivě napsal v Pythonu, funguje to, je to pomalé a nedá se s tím nic dělat, tak je jediná možnost naprogramovat to v C a udělat binding do Pythonu (jestli chceš zůstat u jazyka vyšší úrovně).

Python je přímo na tohle stavěný. Velmi pohodlně se v něm píše, ale kritické části lze napsat v C, přičemž "python C API" je poměrně jednoduché. Tím spojuje výhody obou přístupů.

I kdyby byl Python stokrát pomalejší než C, tak při osmihodinovém běhu Pythonovského programu to představuje pět minut v C. Myslím, že něco je špatně bez ohledu na výběr jazyka ...

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.