随着内存使用量的增加,Python性能会下降

时间:2012-11-27 10:11:35

标签: python performance python-imaging-library

我有以下函数将图像转换为哈希值列表(使用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

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

2 个答案:

答案 0 :(得分:1)

你可能会尝试禁用垃圾收集器,

import gc
gc.disable()

#your code

gc.enable()

答案 1 :(得分:0)

我不知道你的图像有多大,但如果你认为这是一个内存问题,我首先会检查进程使用多少内存。您可以在线查找要在线调用的配方(例如here),也可以只跟踪操作系统进程监视器中的内存使用情况。

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

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