[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