Python 3.3 for()循环迭代处理时间呈指数增长?

时间:2014-01-25 06:37:25

标签: python linux python-3.x

我有一个简单的Python(3.3)应用程序,其中迭代之间的处理时间在每次迭代时变得更长。我相信我已将问题隔离到bytes()函数,如下所示。代码看起来像是常数,n时复杂度。然而,当它运行时它实际上射击大约n ^ 2次。我提供两个代码块。第一个区块是违规区块,感觉类似于n ^ 2时间的复杂性。第二个块是一个小的重构,它从处理输入中删除bytes()。这是第一个块:

import hashlib
def gethash(data):
  return hashlib.sha1(data).hexdigest()
body = b"blob 5\01234"

for i in range(1, 100000):
  hashout = gethash(body+bytes(i))
  if(i%1000==0):
    print(".")

(此块的Linux time实用程序输出):real 0m12.742s - user 0m12.188s - sys 0m0.536s

这是第二个块,重构为排除bytes()的使用,并且在迭代之间具有恒定的处理时间(n次复杂度,似乎是正确的):

import hashlib
def gethash(data):
  return hashlib.sha1(data.encode('utf-8')).hexdigest()
body = "blob 5\01234"

for i in range(1, 100000):
  hashout = gethash(body+str(i))
  if(i%1000==0):
    print(".")

(此块的Linux time实用程序输出):real 0m0.305s - user 0m0.296s - sys 0m0.008s

我在Python 3.3.2中使用Linux Mint 16(内核3.11.0-12-x86_64上的通用)。我已经大大简化了这段代码,以更好地表达中心问题。我主要使用Python 3并且可以在Python中编写一些非平凡的应用程序,但我不能声称拥有Pythonic的思维模式。注意到这一点,我试图在Python 2.7.5中运行这两个代码块,并且它们都“正常”迭代一段时间(n次复杂度)。我不太了解该版本及其功能,以了解这是否有意义。谢谢!

1 个答案:

答案 0 :(得分:3)

bytes(i)创建一个充满零的i - 长度bytes对象。请参阅bytearray文档; bytes的构造函数参数的解释方式相同。

要解决此问题,请对字符串进行编码:

  hashout = gethash(body+str(i).encode('utf-8'))

我选择了UTF-8,但是正确的编码可能取决于你想要使用它的上下文。