Python:将1000000个整数写入文件

Python:将1000000个整数写入文件,python,Python,使用Python将1000000个整数(0、1、2…)写入文件而无需压缩等,最简洁的方法是什么?我的答案是:1000000*3字节使用struct模块,但面试官似乎期待着另一个答案 编辑。以随机顺序从1到1000000的数字(所以像5、6、7->5-7这样的变换在极少数情况下可以应用)。您可以使用您知道的任何写入方法,但生成的文件应具有最小大小。我只会写入给定范围的开始和结束,在本例中为1和1000000,因为采访者提到的顺序都不重要。好的,您的解决方案每整数需要三个字节(=24位)。理论上,2

使用Python将1000000个整数(0、1、2…)写入文件而无需压缩等,最简洁的方法是什么?我的答案是:1000000*3字节使用struct模块,但面试官似乎期待着另一个答案


编辑。以随机顺序从1到1000000的数字(所以像5、6、7->5-7这样的变换在极少数情况下可以应用)。您可以使用您知道的任何写入方法,但生成的文件应具有最小大小。

我只会写入给定范围的开始和结束,在本例中为1和1000000,因为采访者提到的顺序都不重要。

好的,您的解决方案每整数需要三个字节(=24位)。理论上,20位就足够了(因为2^19<1.000.000<2^20)


编辑:哎呀,刚刚注意到尼尔的评论也是这么说的。我的答案是CW,因为它确实属于他。

假设你必须记住它们的顺序,并且数字在1到1000000之间,那么只需要20位或2½字节就可以写入每个数字,因为1000000是十六进制的0xF4240。您必须将它们打包在一起,以避免使用这种方法浪费任何空间,但这样做只需要2.5*1000000字节。

使用Python将1000000个整数(0,1,2…)写入文件而无需压缩等最简洁的方法是什么


如果您将
1000000
整数解释为“我没有指定它们必须不同”,那么您可以使用for循环写入
0
100万次。

这个问题显然是不完整的。以下是我非常紧凑的尝试:

f = open('numbers.dat', 'w')
f.write('list(range(1,1000000))')
f.close()
正在加载文件:

f = open('numbers.dat', 'r')
numbers = eval(f.read().strip())
f.close()
应该这样做


事实上,我不明白为什么“python”在这里很重要。如果面试官担心结果文件的大小,那么解决方案可以用任何语言编写。这个问题没有说明面试官想要的是紧凑的输出还是紧凑的代码……

也许他们的意思是这样的
但是你说连续序列很少见,所以可能不是

实际上,你可以做得比2.5MB好得多,因为不是所有的顺序都可能。有人可能会说,超过5%将涉及压缩,因为没有存储序列本身。基本上,您希望存储规范序列号。以随机顺序从0到7的8个数字通常需要24位(
log(8^8)/log(2)
),但如果是标准序列号,则需要16位(
log(8!)/log(2)

基本上,这涉及到提出一种算法,可以将任何整数序列转换成一个巨大的数字。8号序列的可能编号示例为按值排序:

01234567 : 0  
01234576 : 1  
01234657 : 2  
01234675 : 3  
01234756 : 4  
01234765 : 5  
...
此策略的成本是
log(1000000!)/log(2)
(即
log\u 2(1000000!)
)。
标准解决方案的成本通常约为
log(1000000^1000000)/log(2)

您还可以通过对
0000 0000 1111 1111
1111 1111
进行不同的处理来压缩稍多的空间,但这样做所节省的空间非常小

编辑:快速而肮脏的计算表明此优化将大小降低到约2.204MiB


由于鸽子洞原则,我认为无论你是使用压缩还是其他技术,都不可能比这种策略做得更好。

没有什么比一个加载的面试问题更能暴露面试官的无知了。我想你只需要20位,而不是24位。这将使其从3MB降至2.5MB。除此之外,你能在你的代码中实现某种形式的压缩吗?如果数字是随机的,压缩就没用了。1000000<2**20,因此可以写得比20位更紧凑,但提取最后5%将需要更多的工作。请注意,压缩确实有帮助,因为流中浪费了带宽:有些值从未使用过。Deflate只得到大约.5%,这大约是5%浪费空间的十分之一,但它得到的空间相当一致。如果您不知道有关NUMBERS的任何其他信息,那么这是最好的方法,并且必须保留顺序。我认为这不符合条件。顺序很可能很重要(尽管问题中没有具体说明)。否则您根本不需要保存它们。python在这里完全不重要,但我接受了python职位的面试。投票结果。@Bobby:然后,给定名为
numbers
的变量中的数字列表,使用
f.write(str(numbers))
。因此,代码非常紧凑,数字被写入到文件中,这正是面试官想要的,加载工作也是一样的。(我不得不承认这种文件格式效率很低)@Bobby:但是结果文件一点也不紧凑,这挫败了问题的最后一点。我会接受这一点,因为@neil首先提出了这个想法。有人能解释一下如何将20位int写入文件吗?结构模块没有合适的API用于此…@Vladimir:使用
struct
模块执行此操作的一种方法是成对地获取数字,将一个数字向左移动20位并按位移动,或者与另一个按位移动,以获得40位的值。然后把它分成5个独立的整数,b0到b4,代表值的每个字节。然后可以使用struct.pack('bbbbbbb',b0,b1,b2,b3,b4)
将这组5个小整数转换为一个5字节的字符串。我只需指定字符“!”表示一行中的一百万个零,并将其写入文件。