Python:将1,000,000个int写入文件

时间:2010-11-05 09:59:11

标签: python

在没有压缩等的情况下使用Python将1,000,000个int(0,1,2 ......)写入文件的最紧凑方法是什么?我的答案是:使用struct模块1,000,000 * 3个字节,但看起来像面试官期待的另一个答案......

编辑。以随机顺序从1到1,000,000的数字(因此在极少数情况下可以应用如5,6,7-> 5-7的变换)。您可以使用您知道的任何书写方法,但生成的文件应该具有最小尺寸。

7 个答案:

答案 0 :(得分:4)

实际上,你可以做到超过2.5MB的A LOT,因为不是所有的订单都是可能的。有人可能会争辩说,击败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_2(1000000!)) 标准解决方案的成本通常约为log(1000000^1000000)/log(2)

您还可以通过不同方式处理0000 0000 1111 11111111 1111来挤出更多空间,但这样做所节省的空间量非常小。

编辑:快速而肮脏的计算表明此优化会将尺寸降至约2.204MiB。

由于鸽子原则,我不相信有可能比这个策略更好,无论你是使用压缩技术还是其他技术。

答案 1 :(得分:2)

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

编辑:糟糕,刚刚注意到尼尔的评论同样如此。我正在回答CW,因为它真的属于他。

答案 2 :(得分:2)

假设你必须记住它们的顺序并且数字在1到1,000,000的范围内,那么每个数字只需要20位或2½个字节,因为1,000,000是十六进制的0xF4240。你必须把它们打包在一起,不要用这种方法浪费任何空间,但这样做只需要2.5 * 1,000,000字节。

答案 3 :(得分:1)

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

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'在这里很重要。如果采访者担心结果文件的大小,则可以用任何语言编写解决方案。问题没有说明面试官是否需要紧凑的输出或紧凑的代码...

答案 4 :(得分:0)

我只会写出给定范围的开始和结束,在这种情况下为1和1,000,000,因为面试官提到的顺序很重要。

答案 5 :(得分:0)

What is the most compact way to write 1,000,000 ints (0, 1, 2...) to file using Python without zipping etc

如果您将1,000,000整数解释为“我没有指定它们必须不同”,您只需使用for循环就可以写入0一百万次。

答案 6 :(得分:0)

也许他们的意思是这样的 pythonic-way-to-convert-a-list-of-integers-into-a-string-of-comma-separated-range然后你说连续序列很少见,所以也许不是