Можете воспользоваться модулем 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 можно, на мой взгляд, сохранять в файл, открытый для записи в двоичном режиме. Здесь представлена длина "массива", затем его составляющие.