我有一个简单的例子:
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秒!
答案 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:]
使用索引简单地遍历字符串并最后清除变量会更有效。