1

我有以下函数将图像转换为哈希值列表(使用 PIL):

def _GetImageHash(image):
  st = time.time()
  image_list = list(image.getdata())
  (columns, rows) = image.size
  hash_vals = [0]*rows
  for i in xrange(0,rows):
    hash_vals[i] = hash(tuple(image_list[i*columns:(i+1)*columns]))
  print "_GetImageHash time taken: ", time.time() - st
  return hash_vals, image_list

在另一个函数中,我对许多图像文件调用此方法,并存储结果列表。但是,我观察到此函数计算哈希值所需的时间会随着每次调用而显着增加。如果我更改调用的顺序,它不会改变观察到的行为(所有图像的大小相同,因此该函数计算散列值所需的时间应该没有显着差异)。事实上,如果我这样做:

image1_hash, image1_list = _GetImageHash(image1)
image2_hash, image2_list = _GetImageHash(image1)
image3_hash, image3_list = _GetImageHash(image1)
image4_hash, image4_list = _GetImageHash(image1)
image5_hash, image5_list = _GetImageHash(image1) ...

报道的时间是这样的:

_GetImageHash time taken:  0.672996044159
_GetImageHash time taken:  1.40435290337
_GetImageHash time taken:  2.10946083069
_GetImageHash time taken:  2.84965205193
_GetImageHash time taken:  3.57753205299
_GetImageHash time taken:  4.71754598618
_GetImageHash time taken:  5.10348200798
_GetImageHash time taken:  5.83603620529
_GetImageHash time taken:  6.57408809662
_GetImageHash time taken:  7.30649399757
_GetImageHash time taken:  7.26073002815
_GetImageHash time taken:  7.94218182564

似乎发生这种情况是因为我正在存储列表。但是为什么性能会因为这里的内存使用而受到影响呢?可以做些什么来解决这个问题,以便内存使用不会对时间性能产生如此巨大的影响吗?

4

2 回答 2

1

您可以尝试禁用垃圾收集器,

import gc
gc.disable()

#your code

gc.enable()
于 2012-12-11T10:05:49.233 回答
0

我不知道您的图像有多大,但如果您认为这是内存问题,我会先检查进程使用了​​多少内存。您可以在线查找配方以在进程中调用(例如此处),或者仅在操作系统的进程监视器中跟踪内存使用情况。

如果是内存使用,我要做的第一件事就是用更紧凑的东西替换列表版本 image_list。Numpy 数组将是理想的,但即使是标准库模块数组也应该有所帮助。

我说应该,因为如果 image_list 中的值都是小整数(低于大约 256),那么 Python 使用的是更小、更紧凑的存储,而不是重新分配这些整数。它正在重新分配列表中的指针以保存它们。如果您让数组保存 4 (8) 个字节值,那么这将与 32 (64) 位系统上的列表使用的指针大小相同。没用过PIL,所以对pil.Image.getdata的返回不熟悉。

于 2012-11-27T10:37:55.690 回答