为什么打包这么慢?

时间:2011-07-29 09:14:32

标签: python

我有一个简单的例子:

def __init__(self,string):
    self.string = string

def UI32(self):
    tmp = self.string[:4]
    self.string = self.string[4:]
    return unpack(">I",tmp)[0]

data = file.read()
U = UI(data)
for i in range(60000):
    test = UI32()

总时间:22秒!

2 个答案:

答案 0 :(得分:5)

首先,我无法在我的系统上重现22s(Intel Nehalem,64位Ubuntu,Python 2.6.5)。

以下 1.4s (这基本上是您的代码,我填写了一些空白):

import struct

class UI(object):
    def __init__(self,string):
        self.string = string

    def UI32(self):
        tmp = self.string[:4]
        self.string = self.string[4:]
        return struct.unpack(">I",tmp)[0]

U = UI('0' * 240000)
for i in range(60000):
    test = U.UI32()

现在,这里有一些明显的低效率,特别是在self.string附近。

我已经重写了你的代码:

import struct

class UI(object):
    def __init__(self,string):
        fmt = '>%dI' % (len(string) / 4)
        self.ints = struct.unpack(fmt, string)
    def __iter__(self):
        return iter(self.ints)

U = UI('0' * 240000)
count = 0
for test in U:
    count += 1
print count

在同一台机器上,它现在需要 0.025s

答案 1 :(得分:3)

60,000循环循环的每次迭代都要复制整个内存缓冲区:

self.string = self.string[4:]

使用索引简单地遍历字符串并最后清除变量会更有效。