Zkoušel jsem nějaké srovnání rychlosti vyhodnocování regulárních výrazů nad větším množstvím řetězců - z toho co jsem zkoušel byl nejrychlejší grep, pak pypy2, pak go, pak python2, pak nodejs, pak php a až daleko za tím python3.
Prostě python3 je při práci s řetězci velmi pomalý.
Připisuju to jeho snaze převádět všechny řetězce automaticky do unicode - je možné, že ostatní jazyky/verze by s nestandardním kódováním dělaly chyby... ale aspoň by je dělaly rychle :-).
Která verze to dělala? Ptám se proto, že od verze 3.3 se automaticky volí mezi čtyřmi typy reprezentace znaků (https://docs.python.org/dev/whatsnew/3.3.html#pep-393), takže třeba u typického použití (JSON/XML) už by mohla být spotřeba paměti stejná, jako u Pythonu 2.x bez použití Unicode.
Tady pomůže modul "dis", který zobrazí vygenerovaný bajtkód.
Pro Python 2 dostaneme zhruba toto:
64 LOAD_NAME 0 (factorial)
67 LOAD_CONST 6 (999)
70 CALL_FUNCTION 1
73 PRINT_ITEM
74 PRINT_NEWLINE
(PRINT_ITEM a PRINT_NEWLINE jsou specialni instrukce pro *prikaz* print)
Pro Python 3 pak dostaneme neco jineho:
72 LOAD_NAME 3 (print)
75 LOAD_NAME 0 (factorial)
78 LOAD_CONST 7 (999)
81 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
84 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
87 POP_TOP
Takze Python 3 ma skutecne obsazen o jeden zasobnikovy ramec vic kvuli funkci print()!