Как грамотно сохранять множество в питоне при выходе из программы?
Самый простой путь - pickle. Единственный недостаток, плохая совместимость между версиями питона, это когда сохранились в одной версии, а восстанавливаем в другой.import pickle

a=[]
fp = open("afile.bin")
pickle.dump(a,fp) #сохранить
a=pickle.load(fp) #восстановить
Можете воспользоваться модулем struct:import random
import struct
>>> my_set={random.randint(1,1000) for _ in xrange(10)}
>>> my_set
set([246, 898, 918, 113, 11, 677, 82, 374, 184, 101])
data = struct.pack("I%dH" % len(my_set), len(my_set), *list(my_set))
>>> data
'\n\x00\x00\x00\xf6\x00\x82\x03\x96\x03q\x00\x0b\x00\xa5\x02R\x00v\x01\xb8\x00e\x00'


(data_len,)=struct.unpack("I", data[:struct.calcsize("I")])
>>> data_len
10

>>> reconstructed_set=set(struct.unpack("%dH" % data_len,data[struct.calcsize("I"):]))
>>> reconstructed_set
set([898, 246, 11, 113, 82, 918, 184, 374, 101, 677])
>>> reconstructed_set==my_set
True
В этом примере содержимое data можно, на мой взгляд, сохранять в файл, открытый для записи в двоичном режиме. Здесь представлена длина "массива", затем его составляющие.