Может быть, если вас не пугает Си, и вы уверены, что на нем получится компактнее, его использовать его через
ctypes, например? С поддержкой такого решения на *nix системах проблем не будет.
Еще один извращенный способ, который пришел в голову — подмонтировать рамдиск через
fusepy, создать в рамдиске файл через zlib и ходить по нему seek-ом. :)
Ну и третий вариант — еще раз подумать. Строки у вас юникодные или ASCII? Нужно ли держать весь список в памяти (это требование производительности?) или приемлемо подгружать очередную порцию, например, фоново, когда текущая подходит к концу?