当我使用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位
答案 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
问题似乎出现在您的环境中。可能性是;
您必须提供有关您的环境的更多信息。
答案 1 :(得分:0)
因为在最后一行str(decompressed)
中,您正在构建二进制字符串的“可读”表示。这个过程很慢而且记忆力很大。
一个例子:
>>> b = bytes(range(256))
>>> len(b)
256
>>> len(str(b))
738
>>>
尝试使用大字符串。