Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中压缩整数列表_Python_List_Memory_Compression - Fatal编程技术网

在Python中压缩整数列表

在Python中压缩整数列表,python,list,memory,compression,Python,List,Memory,Compression,我有一个具有以下属性的正(随机)整数列表: 元素数:78495 元素的最大值:999982 转换为字符串时的列表长度:517115(字符串看起来像“679384238956,…”) 磁盘上文本文件中列表的大小:520 kb 我试图将此列表用作在线判断问题的预计算列表,因为实际生成此列表需要很长时间。但是,如果我将它直接粘贴到源代码中,它太大了,无法接受,因为源代码的上限为50KB 我将zlib作为压缩字符串的一种方法,但它似乎只将大小减半 有没有一种方法可以缩小这个范围,这样我就可以在源代码中解

我有一个具有以下属性的正(随机)整数列表:

元素数:78495

元素的最大值:999982

转换为字符串时的列表长度:517115(字符串看起来像“679384238956,…”)

磁盘上文本文件中列表的大小:520 kb

我试图将此列表用作在线判断问题的预计算列表,因为实际生成此列表需要很长时间。但是,如果我将它直接粘贴到源代码中,它太大了,无法接受,因为源代码的上限为50KB

我将zlib作为压缩字符串的一种方法,但它似乎只将大小减半

有没有一种方法可以缩小这个范围,这样我就可以在源代码中解包/使用它?

简而言之,没有

log(2, 999982) ~= 20
所以最大的数字需要20位来存储。假设平均每个数字需要存储10位(平均分布在0和最大值之间)

因此,这些尽可能高效地存储的数字将占用约100KB的空间

只有当数字具有一些非随机性时,压缩才会起作用。如果它们真的是随机的,就像你说的,那么一个通用的压缩算法将无法使它变得更小,所以100KB是你希望做的最好的

编辑

请注意,更糟糕的是,您希望将这些数据粘贴到源代码中,因此不能仅使用任意二进制数据。您需要一些文本友好的东西,比如base64编码,这将增加约33%的开销。此外,您不能根据所需的平均位数来存储数字,因为您需要某种方法来知道每个数字使用了多少位。有可能的编码方案,但都会带来一些额外的开销

第二次编辑

根据上述评论,数据实际上并非如最初所述的随机。因此,一个通用的压缩算法可能会起作用,如果不起作用,可能还有其他的解决方案(例如,只需发送生成数字的代码,可能小于50KB)。

简言之,没有

log(2, 999982) ~= 20
所以最大的数字需要20位来存储。假设平均每个数字需要存储10位(平均分布在0和最大值之间)

因此,这些尽可能高效地存储的数字将占用约100KB的空间

只有当数字具有一些非随机性时,压缩才会起作用。如果它们真的是随机的,就像你说的,那么一个通用的压缩算法将无法使它变得更小,所以100KB是你希望做的最好的

编辑

请注意,更糟糕的是,您希望将这些数据粘贴到源代码中,因此不能仅使用任意二进制数据。您需要一些文本友好的东西,比如base64编码,这将增加约33%的开销。此外,您不能根据所需的平均位数来存储数字,因为您需要某种方法来知道每个数字使用了多少位。有可能的编码方案,但都会带来一些额外的开销

第二次编辑

根据上述评论,数据实际上并非如最初所述的随机。因此,一个通用的压缩算法可能会起作用,如果不起作用,可能还有其他解决方案(例如,只需发送最初生成数字的代码,可能小于50KB)。

可用的压缩算法提供(大约)12-17%的压缩比(62.4-90KB),因此您无法达到阈值。您的数据也是随机的,这通常会使压缩算法的性能更差

看看另一种方法,例如加快RNG进程,或者如果不需要完整的列表(只是一些整数),则创建一个单独的“生产者”线程来生成随机整数(涉及您正在使用的任何实际数学)和一个“消费者”线程,该线程在这些整数出现时对其进行处理。这样,即使生成完整列表需要很长时间,您的程序可能仍然可以工作。

可用的压缩比(大约)为12-17%(62.4-90 kB),因此您无法达到阈值。您的数据也是随机的,这通常会使压缩算法的性能更差


看看另一种方法,例如加快RNG进程,或者如果不需要完整的列表(只是一些整数),则创建一个单独的“生产者”线程来生成随机整数(涉及您正在使用的任何实际数学)和一个“消费者”线程,该线程在这些整数出现时对其进行处理。这样,即使需要很长时间才能生成完整的列表,您的程序可能仍然可以工作。

根据您的定义

它是一个最小k值列表,对于素数p>5,其10^k=1 mod p

。。。我认为你的值的形式是
(p-1)/x
,其中x是一个大大小于p的整数,这是错误的吗

例如,对于p<50,我们有:

p = 7  : 10^6  = 1 (mod 7)  => k = 6  = (p - 1) / 1  => x = 1
p = 11 : 10^2  = 1 (mod 11) => k = 2  = (p - 1) / 5  => x = 5
p = 13 : 10^6  = 1 (mod 13) => k = 6  = (p - 1) / 2  => x = 2
p = 17 : 10^16 = 1 (mod 17) => k = 16 = (p - 1) / 1  => x = 1
p = 19 : 10^18 = 1 (mod 19) => k = 18 = (p - 1) / 1  => x = 1
p = 23 : 10^22 = 1 (mod 23) => k = 22 = (p - 1) / 1  => x = 1
p = 29 : 10^28 = 1 (mod 29) => k = 28 = (p - 1) / 1  => x = 1
p = 31 : 10^15 = 1 (mod 31) => k = 15 = (p - 1) / 2  => x = 2
p = 37 : 10^3  = 1 (mod 37) => k = 3  = (p - 1) / 12 => x = 12
p = 41 : 10^5  = 1 (mod 41) => k = 5  = (p - 1) / 8  => x = 8
p = 43 : 10^21 = 1 (mod 43) => k = 21 = (p - 1) / 2  => x = 2
p = 47 : 10^46 = 1 (mod 47) => k = 46 = (p - 1) / 1  => x = 1
x值列表的压缩效果应该比k值列表好得多。(例如,我愿意打赌x的最频繁值为“1”。)

由于计算100万个素数(我认为这是你的上限)非常简单和快速,你可以基于压缩的x值列表和实时计算的素数列表快速重建k值列表


您可能应该从一开始就解释您试图压缩哪些内容以获得更准确的答案。

根据您的定义

它是一个最小k值列表,对于素数p>5,其10^k=1 mod p

。。。我认为你的值的形式是
(p-1)/x
,其中x是一个大大小于p的整数,这是错误的吗

例如,对于p<50,我们有:

p = 7  : 10^6  = 1 (mod 7)  => k = 6  = (p - 1) / 1  => x = 1
p = 11 : 10^2  = 1 (mod 11) => k = 2  = (p - 1) / 5  => x = 5
p = 13 : 10^6  = 1 (mod 13) => k = 6  = (p - 1) / 2  => x = 2
p = 17 : 10^16 = 1 (mod 17) => k = 16 = (p - 1) / 1  => x = 1
p = 19 : 10^18 = 1 (mod 19) => k = 18 = (p - 1) / 1  => x = 1
p = 23 : 10^22 = 1 (mod 23) => k = 22 = (p - 1) / 1  => x = 1
p = 29 : 10^28 = 1 (mod 29) => k = 28 = (p - 1) / 1  => x = 1
p = 31 : 10^15 = 1 (mod 31) => k = 15 = (p - 1) / 2  => x = 2
p = 37 : 10^3  = 1 (mod 37) => k = 3  = (p - 1) / 12 => x = 12
p = 41 : 10^5  = 1 (mod 41) => k = 5  = (p - 1) / 8  => x = 8
p = 43 : 10^21 = 1 (mod 43) => k = 21 = (p - 1) / 2  => x = 2
p = 47 : 10^46 = 1 (mod 47) => k = 46 = (p - 1) / 1  => x = 1
名单