解压缩时,zlib和lzma没有响应 - python 3.4

时间:2015-08-23 16:01:44

标签: python python-3.x zlib lzma

当我使用lzma模块或zlib模块压缩31kb字符串并解压缩时,python没有响应,占用了我的cpu的50%左右。这些模块使用较小的字符串。

这是我的代码:

import zlib

open_file = open('big_file.txt','r')

text = open_file.read()

compressed = zlib.compress(text.encode('UTF-8'))
print(compressed)


decompressed = zlib.decompress(bytes(compressed))
print(str(decompressed))

编辑:

Cpu:Intel Core 2 Extreme X7900 @ 2.8ghz

Ram:3gb DDR 2

Os:Windows 10 64位(管理员权限)

Python版本:3.4.3 32位

2 个答案:

答案 0 :(得分:0)

在Python 3上不需要花那么长时间。请注意,我已经将文本读作字节,并省略了Python 3上不需要的一些编码/ str步骤。

在运行2.5 GHz的Intel Core 2 Q9300上进行的测试。在FreeBSD 10.2 AMD64上使用Clang 3.4.1编译的Python 3.4.3(64位)。

In [1]: import zlib

In [2]: with open('foo.txt', 'rb') as datafile:
    btext = datafile.read()
   ...:     

In [3]: len(btext)
Out[3]: 23931

In [4]: type(btext)
Out[4]: bytes

此文本约为23 kiB,已经采用bytes的形式,因此不需要编码。

In [5]: compressed = zlib.compress(btext)

In [6]: %timeit zlib.compress(btext)
1000 loops, best of 3: 735 µs per loop

In [7]: len(compressed)
Out[7]: 4787

In [8]: type(compressed)
Out[8]: bytes

In [9]: uncompressed = zlib.decompress(compressed)

In [10]: %timeit zlib.decompress(compressed)
10000 loops, best of 3: 118 µs per loop

压缩和解压缩都以微秒为单位进行测量。这几乎不可能。

更精确地复制代码会产生大致相同的结果:

In [1]: import zlib

In [2]: with open('foo.txt') as datafile:
    text = datafile.read()
   ...:     

In [3]: %timeit zlib.compress(text.encode('UTF-8'))
1000 loops, best of 3: 767 µs per loop

In [4]: compressed =  zlib.compress(text.encode('UTF-8'))

In [5]: type(compressed)
Out[5]: bytes

In [6]: %timeit zlib.decompress(bytes(compressed))
10000 loops, best of 3: 121 µs per loop

问题似乎出现在您的环境中。可能性是;

  • 没有足够的内存导致交换。
  • 在类UNIX操作系统上,用户限制设置得太低。
  • 慢CPU。

您必须提供有关您的环境的更多信息。

答案 1 :(得分:0)

因为在最后一行str(decompressed)中,您正在构建二进制字符串的“可读”表示。这个过程很慢而且记忆力很大。

一个例子:

>>> b = bytes(range(256))
>>> len(b)
256
>>> len(str(b))
738
>>> 

尝试使用大字符串。