[python] Tip: Interning
Vladimir Macek
macek na sandbox.cz
Pondělí Červen 23 17:03:14 CEST 2014
Mel jsem kdysi skript, ve kterem byly dlouhodobe v RAM tak velke slovniky,
ze bylo potreba, aby sdilely pamet pro uchovani svych immutable klicu!
A to i kdyz ty klice byly ciselne.
Pouzil jsem pro to adaptovany http://code.activestate.com/recipes/499299/
Ze se ta technika nazyva internovani, to jsem netusil.
A co jsem doted uz vubec netusil je to, ze pro retezce Python nabizi za
stejnym ucelem built-in
intern()
V Python 3 jako
sys.intern()
CPython provadi nezarucenou internaci taky sam. Dokonce i na necem, co
vypada jako vysledek run-time vypoctu, ale neni:
>>> x = "aa"
>>> y = "a" + "a"
>>> x == y, x is y
(True, True)
>>> dis.dis(compile('x = "aa"', '', 'single'))
1 0 LOAD_CONST 0 ('aa')
3 STORE_NAME 0 (x)
...
>>> dis.dis(compile('x = "a" + "a"', '', 'single'))
1 0 LOAD_CONST 2 ('aa')
3 STORE_NAME 0 (x)
...
Ale nelze na to spolehat:
>>> xx = 'a a'
>>> yy = 'a a'
>>> xx == yy, xx is yy
(True, False)
Povidani o poslednim prikadu:
http://stackoverflow.com/questions/21203212/python-string-with-space-and-without-space-at-the-end-and-immutability
Kdyz se ale spolehnout potrebujeme:
>>> xxx = intern('a a')
>>> yyy = intern('a a')
>>> xxx == yyy, xxx is yyy
(True, True)
Muze vam to usetrit hordy pameti a znacne zrychlit vykonavani. Za cenu
urciteho zpomaleni pri vytvareni retezce.
--
: Vladimir Macek : http://macek.sandbox.cz : +420 608 978 164
: UNIX && Dev || Training : Python, Django : PGP key 97330EBD
:
: PRÁZDNINOVÁ ŠKOLENÍ: http://macek.sandbox.cz/skoleni/aktualni/
Další informace o konferenci Python